【发布时间】:2019-07-27 08:12:02
【问题描述】:
我已经模拟了 userManager 并使用返回值设置了所需的函数。
但是,每当我尝试运行单元测试时,即使我设置的返回值不同,我也会不断收到错误/失败的返回值。
[TestCase]
public async Task Verify_UserInRole_False()
{
var userRole = "Supervisor";
var email = "test@test.com";
var mockUserStore = new Mock<IUserStore<IdentityUser>>();
var mockUserRoleStore = mockUserStore.As<IUserRoleStore<IdentityUser>>();
var mockedUserManager = new Mock<UserManager<IdentityUser>>(new Mock<IUserStore<IdentityUser>>(mockUserRoleStore).Object,
new Mock<IOptions<IdentityOptions>>().Object,
new Mock<IPasswordHasher<IdentityUser>>().Object,
new IUserValidator<IdentityUser>[0],
new IPasswordValidator<IdentityUser>[0],
new Mock<ILookupNormalizer>().Object,
new Mock<IdentityErrorDescriber>().Object,
new Mock<IServiceProvider>().Object,
new Mock<ILogger<UserManager<IdentityUser>>>().Object);
mockedUserManager.Setup(x => x.FindByEmailAsync(email))
.ReturnsAsync(It.Is<IdentityUser>(u => u.UserName == email));
mockUserRoleStore.Setup(x => x.IsInRoleAsync(It.Is<IdentityUser>(u => u.UserName == email), userRole, It.IsAny<CancellationToken>()))
.ReturnsAsync(true);
AdminController adminController = new AdminController(hostingEnvironment, signInManager, logger, roleManager, mockedUserManager.Object);
var actionResult = await adminController.CheckIfUserIsInRole(email, userRole);
Assert.IsTrue(actionResult);
}
待测方法:
public async Task<bool> CheckIfUserIsInRole(string email, string role)
{
return await _userManager.IsInRoleAsync(await _userManager.FindByEmailAsync(email), role);
}
userManager 的各种方法也是如此,例如 AddToRole();等等
据我了解: 当我在嘲笑 IsInRoleAsync() 时, 一旦 CheckIfUserIsInRole(...) 方法被命中, IsInRoleAsync() 应该被模拟对象替换,并且应该返回我们配置模拟对象返回的任何内容。
我做错了什么?
谢谢:)
【问题讨论】:
标签: asp.net unit-testing asp.net-core moq nunit-3.0