微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MSTest 单元测试控制器

如何解决MSTest 单元测试控制器

学习 MSTest -- 尝试对 REST 函数进行单元测试:AccountController(我相信它会起作用)我想从 Register 开始.由于某种原因,我无法设置 Mocks。 (Moq 已安装)。 另外,我对这可能有什么用感到困惑;如果我模拟所有控制器输入,我将不会得到任何回报?您的建议?

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
        };
    }

顺便说一句,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
        }

编译器错误如下所示:

enter image description here

其他参数有类似的错误信息。

您的建议或将我指向一个涵盖 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 以了解如何实际使用该库

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?