[英]MSTest Unit Testing Controller
Learning MSTest -- trying to unit test a REST function: AccountController (which I believe will work) I want to start with Register .学习 MSTest - 尝试对 REST function: AccountController进行单元测试(我相信它会起作用)我想从Register开始。 I can't get the Mocks setup for some reason.
由于某种原因,我无法设置 Mocks。 (Moq is installed).
(起订量已安装)。 Also, I'm confused as to how this could possibly be of any use;
另外,我对这怎么可能有用感到困惑。 if I mock all the controller inputs, I'm not going to get anything back?
如果我模拟所有 controller 输入,我不会得到任何回报? Your Advice?
你的建议?
AccountController - target of the unit test: AccountController - 单元测试的目标:
namespace API.Controllers
{
public class AccountController : BaseApiController
{
private readonly UserManager<AppUser> _userManager;
private readonly SignInManager<AppUser> _signInManager;
private readonly RoleManager<IdentityRole> _roleManager;
private readonly ITokenService _tokenService;
private readonly IMapper _mapper;
public AccountController(
UserManager<AppUser> userManager,
SignInManager<AppUser> signInManager,
RoleManager<IdentityRole> roleManager,
ITokenService tokenService,
IMapper mapper)
{
_signInManager = signInManager;
_roleManager = roleManager;
_mapper = mapper;
_tokenService = tokenService;
_userManager = userManager;
}
[HttpPost("register")]
// [Authorize]
[Authorize(Roles = "Admin")]
public async Task<ActionResult<UserDto>> Register(RegisterDto registerDto)
{
if (await this.UserExistsAsync(registerDto.Username)) return BadRequest("Username is taken");
var user = _mapper.Map<AppUser>(registerDto);
user.UserName = registerDto.Username.ToLower();
var result = await _userManager.CreateAsync(user, registerDto.Password);
if (!result.Succeeded) return BadRequest(result.Errors);
var roleResult = await _userManager.AddToRoleAsync(user, "User");
if (!roleResult.Succeeded) return BadRequest(result.Errors);
return new UserDto
{
Username = user.UserName,
Token = await _tokenService.CreateToken(user),
KnownAs = user.KnownAs
};
}
BTW BaseController is simply: BTW BaseController 很简单:
{
[ApiController]
[Route("api/[controller]")]
public class BaseApiController : ControllerBase
{
}
}
The Unit Test so far is:到目前为止的单元测试是:
namespace API.Controllers.Tests
{
[TestClass()]
public class AccountControllerTests
{
[TestMethod()]
public async void AccountController_Register()
{
var _userManager = new Mock<UserManager<AppUser>>();
var _signInManager = new Mock<SignInManager<AppUser>>();
var _roleManager = new Mock<RoleManager<IdentityRole>>();
ITokenService tokenService;
IMapper mapper;
RegisterDto userDto = new RegisterDto()
{
Username = "Admin",
Password = "Secret1234",
FirstName = "Johnny",
LastName = "Appleseed",
Phone1 = "6175551212",
Phone2 = "",
KnownAs = "Dude",
EmailAddress = "Dude@Somewhere.com",
Question = "ask",
Answer = "answer",
};
AccountController accountController = new AccountController(_userManager,
_signInManager,
_roleManager,
tokenService,
mapper);
await accountController.Register(userDto);
Assert.Fail(); <<---- this will be replaced obviously
}
The compiler error looks like this:编译器错误如下所示:
Other arguments have a similar error message.其他 arguments 也有类似的错误信息。
Your Advice OR point me to a tutorial somewhere that covers MSTest Mocks:-) Thanks in advance.您的建议或将我指向一个涵盖 MSTest Mocks 的教程:-) 提前致谢。
Chuck查克
For Mock<T>
you need to call .Object
to get the mocked type对于
Mock<T>
您需要调用.Object
来获取模拟类型
AccountController accountController =
new AccountController(_userManager.Object, //<-- NOTE ".Object" on Mock<T>
_signInManager.Object,
_roleManager.Object,
tokenService,
mapper);
Also you will need to setup the expected behavior using .Setup
so that the mock behave as expected when the subject under test is being exercised.此外,您还需要使用
.Setup
设置预期行为,以便在测试被测对象时模拟行为符合预期。
Reference Moq Quickstart to get an idea of how to actually use the library参考Moq Quickstart以了解如何实际使用该库
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.