MSTest 单元测试控制器
MSTest Unit Testing Controller
Learning MSTest -- 尝试对 REST 函数进行单元测试:AccountController(我相信它会起作用)我想从注册。由于某种原因,我无法设置 Mocks。 (已安装最小起订量)。
另外,我对这怎么可能有任何用处感到困惑;如果我模拟所有控制器输入,我不会得到任何回报?你的建议?
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 很简单:
{
[ApiController]
[Route("api/[controller]")]
public class BaseApiController : ControllerBase
{
}
}
到目前为止的单元测试是:
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
}
编译器错误如下所示:
其他参数也有类似的错误信息。
你的建议或将我指向某个包含 MSTest Mocks 的教程:-)
提前致谢。
查克
对于 Mock<T>
你需要调用 .Object
来获取模拟类型
AccountController accountController =
new AccountController(_userManager.Object, //<-- NOTE ".Object" on Mock<T>
_signInManager.Object,
_roleManager.Object,
tokenService,
mapper);
此外,您还需要使用 .Setup
设置预期行为,以便模拟在测试对象被练习时按预期表现。
参考 Moq Quickstart 以了解如何实际使用该库
Learning MSTest -- 尝试对 REST 函数进行单元测试:AccountController(我相信它会起作用)我想从注册。由于某种原因,我无法设置 Mocks。 (已安装最小起订量)。 另外,我对这怎么可能有任何用处感到困惑;如果我模拟所有控制器输入,我不会得到任何回报?你的建议?
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 很简单:
{
[ApiController]
[Route("api/[controller]")]
public class BaseApiController : ControllerBase
{
}
}
到目前为止的单元测试是:
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
}
编译器错误如下所示:
其他参数也有类似的错误信息。
你的建议或将我指向某个包含 MSTest Mocks 的教程:-) 提前致谢。
查克
对于 Mock<T>
你需要调用 .Object
来获取模拟类型
AccountController accountController =
new AccountController(_userManager.Object, //<-- NOTE ".Object" on Mock<T>
_signInManager.Object,
_roleManager.Object,
tokenService,
mapper);
此外,您还需要使用 .Setup
设置预期行为,以便模拟在测试对象被练习时按预期表现。
参考 Moq Quickstart 以了解如何实际使用该库