我试图模拟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);
}
Run Code Online (Sandbox Code Playgroud)
在user上面总是空的,因为我从来没有插入.所以我遇到的问题是如何使userManager(不是模拟器)从我的模拟商店返回用户?
这个答案有些相似,但在这里没有回答我的问题.
任何帮助非常感谢
mil*_*nio 16
您需要模拟对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);
}
Run Code Online (Sandbox Code Playgroud)
但是,我相信通过这样的测试,您正在测试Microsoft.AspNet.Identity.UserManager而不是您的代码.你所证明的是UserManager以某种方式调用你的mockStore.
Microsoft.AspNet.Identity的源代码包含这些类型的测试.
MockHelper.cs从Identitygit repo中的测试检查类
您应该在那里找到有关模拟的灵感,例如
public static UserManager<TUser> TestUserManager<TUser>(IUserStore<TUser> store = null) where TUser : class
{
store = store ?? new Mock<IUserStore<TUser>>().Object;
var options = new Mock<IOptions<IdentityOptions>>();
var idOptions = new IdentityOptions();
idOptions.Lockout.AllowedForNewUsers = false;
options.Setup(o => o.Value).Returns(idOptions);
var userValidators = new List<IUserValidator<TUser>>();
var validator = new Mock<IUserValidator<TUser>>();
userValidators.Add(validator.Object);
var pwdValidators = new List<PasswordValidator<TUser>>();
pwdValidators.Add(new PasswordValidator<TUser>());
var userManager = new UserManager<TUser>(store, options.Object, new PasswordHasher<TUser>(),
userValidators, pwdValidators, new UpperInvariantLookupNormalizer(),
new IdentityErrorDescriber(), null,
new Mock<ILogger<UserManager<TUser>>>().Object,
null);
validator.Setup(v => v.ValidateAsync(userManager, It.IsAny<TUser>()))
.Returns(Task.FromResult(IdentityResult.Success)).Verifiable();
return userManager;
}
Run Code Online (Sandbox Code Playgroud)
我用这种方法使用它:
private UserController BuildCoontrollerWithDatabase()
{
DbContextOptionsBuilder dbContextOptionsBuilder = new DbContextOptionsBuilder();
dbContextOptionsBuilder.UseInMemoryDatabase();
ApplicationDbContext applicationDbContext = new ApplicationDbContext( dbContextOptionsBuilder.Options);
var userStore = new UserStore<ApplicationUser>(applicationDbContext);
UserManager<ApplicationUser> userManager = TestUserManager<ApplicationUser>(userStore);
return new UserController(userManager);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7915 次 |
| 最近记录: |