c# - 如何模拟 Asp.net 身份 UserManager 的 CreateAsync 方法

标签 c# asp.net moq

我正在尝试模拟 UserStore 的 CreateAsync 方法以获得内存中的用户存储。

public void Can_Create_User()
{
    //Arrange
    var dummyUser = new ApplicationUser() { UserName = "PinkWarrior", Email = "PinkWarrior@PinkWarrior.com" };
    var mockStore = new Mock<IUserStore<ApplicationUser>>();

    var userManager = new UserManager<ApplicationUser>(mockStore.Object);
    mockStore.Setup(x => x.CreateAsync(dummyUser))
                .Returns(Task.FromResult(IdentityResult.Success));


    //Act
    Task<IdentityResult> tt = (Task<IdentityResult>)mockStore.Object.CreateAsync(dummyUser);
    var user = userManager.FindByName("PinkWarrior");

    //Assert
    Assert.AreEqual("PinkWarrior", user.UserName);
}

上面的 user 总是空的,因为我从不插入它。所以我遇到的问题是我如何制作 userManager,它不是从我的模拟商店返回用户的模拟?

This answer有点相似,但没有在这里回答我的问题。

非常感谢任何帮助

最佳答案

您需要模拟对 FindByNameAsync 的调用,因为这是 UserManager 将调用的内容:

public void Can_Create_User()
{
    //Arrange
    var dummyUser = new ApplicationUser() { UserName = "PinkWarrior", Email = "PinkWarrior@PinkWarrior.com" };
    var mockStore = new Mock<IUserStore<ApplicationUser>>();

    var userManager = new UserManager<ApplicationUser>(mockStore.Object);
    mockStore.Setup(x => x.CreateAsync(dummyUser))
                .Returns(Task.FromResult(IdentityResult.Success));

    mockStore.Setup(x => x.FindByNameAsync(dummyUser.UserName))
                .Returns(Task.FromResult(dummyUser));


    //Act
    Task<IdentityResult> tt = (Task<IdentityResult>)mockStore.Object.CreateAsync(dummyUser);
    var user = userManager.FindByName("PinkWarrior");

    //Assert
    Assert.AreEqual("PinkWarrior", user.UserName);
}

但是,我相信通过这样的测试,您正在测试 Microsoft.AspNet.Identity.UserManager 而不是您的代码。您要证明的是 UserManager 以某种方式调用了您的 mockStore。

Source code for Microsoft.AspNet.Identity包含这些类型的测试。

关于c# - 如何模拟 Asp.net 身份 UserManager 的 CreateAsync 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28645232/

相关文章:

javascript - 如果两个文本框没有值无法正常工作,则禁用提交按钮

asp.net-mvc - 如何在 MVC5 中从 AccountController 模拟 ApplicationUserManager

c# - 无法使用 Moq 在 ASP.NET MVC Controller 中模拟方法调用

unit-testing - 验证两个连续的方法调用每次都使用不同的参数调用模拟方法

c# - 比较存储在字符串中的非常大的数字

c# - 我无法让 RedirectToAction 工作

当使用带有 PathInfo 的 URL 时,ASP.NET 回发将不起作用

c# - 将属性添加到列表中的项目

c# - 如何在 <%= %> 中打印文本?

c# - 使用 nameof() 与其父类一起检查类名以进行 MVC 验证