【问题标题】:ASP.Net Identity 2 RemovePassword MockingASP.Net Identity 2 RemovePassword 模拟
【发布时间】:2014-09-15 13:33:45
【问题描述】:

我想让管理员可以更改用户的密码。

我是这样做的:

var result = await this.UserManager.RemovePasswordAsync(user.Id);

if (result.Succeeded)
{
    result = await this.UserManager.AddPasswordAsync(user.Id, viewModel.MotDePasse);

    if (result.Succeeded)
    {
        return RedirectToAction("Edit", new { Id = viewModel.UserName });
    }
    else
    {
        viewModel.Errors = string.Join("<br />", result.Errors);
    }
}
else
{
    viewModel.Errors = string.Join("<br />", result.Errors);
}

当我运行它时,它可以工作。 但是在尝试对其进行单元测试时,我收到一个错误(在结果对象中):“名称不能为空”。

在我的单元测试中,我有一个这样的 TestInitialize:

_mockUserStore = new Mock<IUserStore<ApplicationUser>>();
var passwordStore = this._mockUserStore
                        .As<IUserPasswordStore<ApplicationUser>>();
passwordStore.Setup(pm => pm.FindByIdAsync(It.IsAny<string>()))
             .Returns(Task.FromResult<ApplicationUser>(new ApplicationUser() { Id = "id", Nom = "Name1" }));

_userManager = new UserManager<ApplicationUser>(this._mockUserStore.Object);

我该如何解决?哪个对象上的名称为空?

【问题讨论】:

  • 你能添加一个堆栈跟踪吗? UserManager 可能正在调用您尚未在测试中设置的用户存储上的其他功能。或者完全不同的东西! ;-)
  • 只要我没有捕捉到任何异常,调用堆栈中就没有任何有趣的东西(或者我不知道要获得更深的调用堆栈):只是 result.Errors。

标签: asp.net-mvc unit-testing moq asp.net-identity


【解决方案1】:

那是 UserValidator 可能会因为没有设置用户名而拒绝用户更新。您可能只需将用户管理器上的 UserValidator 清空

_userManager.UserValidator = null

【讨论】:

  • 你在哪里 .Returns(Task.FromResult(new ApplicationUser() { Id = "id", Nom = "Name1" }));将其更改为包含 UserName = "someusername",并且不要如上所示设置 UserValidator。我没有包含这个答案,因为它可能不起作用!
  • 嗯......它不起作用:如果 UserValidator != null,则错误现在是“someusername”已被占用。如果 UserValidator == null,ArgumentNullException。
  • 如果 null 它不起作用,您始终可以实现一个作为 NoopValidator 的 IUserValidator
  • 谢谢。我只需要模拟 UserValidator 并设置 ValidateAsync,如我的答案所示。
【解决方案2】:

我需要像这样模拟 UserValidator:

var mockUserValidator = new Mock<IIdentityValidator<ApplicationUser>>();
mockUserValidator.Setup(uv => uv.ValidateAsync(It.IsAny<ApplicationUser>()))
                 .Returns(Task.FromResult<IdentityResult>(IdentityResult.Success));

this._userManager.UserValidator = mockUserValidator.Object;

而且它有效。

【讨论】:

    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2011-08-28
    • 2015-02-05
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多