简体   繁体   English

MSTest 单元测试 Controller

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM