【问题标题】:Stuck with moq and unit test for Controller卡住控制器的起订量和单元测试
【发布时间】:2018-04-03 09:20:04
【问题描述】:

我正在尝试为现有项目编写单元测试。我总是得到 SignStatus.Success 和 ModelState.Valid。我知道如何通过在测试中添加模型错误来处理模型状态,这会给我无效的模型。但我不知道为什么我在所有情况下都能成功登录。登录动作是默认的,这里是:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
        return View(model);

    // This doesn't count login failures towards account lockout
    // To enable password failures to trigger account lockout, change to shouldLockout: true
    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            if (String.IsNullOrEmpty(returnUrl) || !Url.IsLocalUrl(returnUrl))
                return RedirectToAction("Index", "Home");
            return Redirect(returnUrl);
        case SignInStatus.LockedOut:
            return View("Lockout");
        case SignInStatus.RequiresVerification:
            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
        case SignInStatus.Failure:
        default:
            ModelState.AddModelError("", "Invalid login attempt.");
            return View(model);
    }
} 

还有我的测试:

[Test]
public async Task LogInSuccessAndReturnViewAsync()
{
    LoginViewModel loginView = new LoginViewModel { Email = "qwe@asd", Password = "123", RememberMe = false };
    //Arrange
    //User.Identity
    var validUser = new Mock<IIdentity>();  
    moqContext.Setup(x => x.User.Identity).Returns(validUser.Object);
    validUser.Setup(x => x.Name).Returns(loginView.Email);

    //ApplicationUserManager
    var user = new ApplicationUser { UserInfo = new UserInfo {
        Id = 336,
        FirstName = "User",
        LastName ="Info",
        CountryId = 1,
        City = null,
        Address = null,
        ZipCode = null,
        Tel = null,
        Position = null,
        PayoutTime = 0,
        LanguageId = 3,
        PayPalAllowIR = false,
        LiqPayAllowIR = false
    } };
    var userStore = new Mock<IUserStore<ApplicationUser>>(MockBehavior.Strict);
    userStore.As<IUserStore<ApplicationUser>>().Setup(x => x.FindByIdAsync(It.IsAny<string>())).ReturnsAsync(user);
    var userManager = new Mock<ApplicationUserManager>(userStore.Object);

    //ApplicationSignInManager
    var authenticationManager = new Mock<IAuthenticationManager>();
    var signInManager = new Mock<ApplicationSignInManager>(userManager.Object, authenticationManager.Object);

    accountController = new AccountController(userManager.Object, signInManager.Object);
    var context = new ControllerContext(moqContext.Object, new System.Web.Routing.RouteData(), accountController);
    accountController.ControllerContext = context;

    //Act
    var res = await accountController.Login(loginView,"/Account/Login");

    //Assert
    Assert.IsNotNull(res);
}

我做错了什么?

【问题讨论】:

  • 那么你到底想测试什么? AccountController.Login 返回不为空?
  • 我无法测试这个,因为我有 NullReferenceException。我想测试一下,该用户的凭据是否正确,用户可以登录然后重定向到“索引”、“主页”。或不正确的凭据

标签: c# asp.net unit-testing moq


【解决方案1】:

当你没有在你的 mock 中设置 SignInManager.PasswordSignInAsync 方法时,它总是会返回输出的默认值 SignInStatus.Success

如果您想要测试的其他返回值,您需要设置您的 SignInManager 实例。

signInManager
    .Setup(x => x.PasswordSignInAsync(It.IsAny<string>(),
                                      It.IsAny<string>(),
                                      It.IsAny<bool>(),
                                      It.IsAny<bool>()))
         .ReturnsAsync(Microsoft.AspNet.Identity.Owin.SignInStatus.Failure);

【讨论】:

  • 它有效。我是否需要为所有情况设置返回状态,而不取决于我传递的模型?
  • 这取决于您的测试。你真的想模拟SignInManager吗? SignInManager.PasswordSignInAsync 的输入无关紧要
  • 我是单元测试和起订量框架的新手。我不知道如何处理它。但控制器中的几乎所有操作都使用 SignInManager 和 UserManager。以及 User.Identity.GetUserId()、UserManager.FindById() 等方法;您能否推荐一些文章、书籍或课程/教程以更好地了解其工作原理?
  • 我现在想不出任何具体的来源。您应该查看 channel9.msdn.com 和 mva.microsoft.com
  • 好的。谢谢你。但是你能解释一下,为什么 SignInManager.PasswordSignInAsync 的输入无关紧要?
猜你喜欢
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多