Прежде всего, пересмотрите ваш подход, я прочитал несколько разных статей, в которых люди говорят, что вам не нужно тестировать библиотеку и инструмент, который уже был протестирован.Но иногда нам нужно издеваться над UserManager
, чтобы внедрить наши сервисы и разрешить эти зависимости.UserManager
может быть очень простым, но подобные сообщения об ошибках не очень хорошо объяснены.Сначала мы должны смоделировать UserStore
и присвоить его UserManager
, чтобы смоделировать UserStore, вы можете создать класс MockUserStore
, который получает IUserStore
и IUserPasswordStore
:
public class MockUserStore : IUserStore<TUser>, IUserPasswordStore<TUser>
Этот класс долженреализовать некоторые методы IUserPasswordStore, в противном случае вы получите это сообщение об ошибке!
public Task SetPasswordHashAsync(TUser user, string passwordHash,
CancellationToken cancellationToken)
{
user.PasswordHash = passwordHash;
return Task.FromResult(0);
}
public Task<string> GetPasswordHashAsync(TUser user, CancellationToken cancellationToken)
{
return Task.FromResult<string>(user.PasswordHash);
}
public Task<bool> HasPasswordAsync(TUser user, CancellationToken cancellationToken)
{
return Task.FromResult<bool>(!String.IsNullOrEmpty(user.PasswordHash));
}
Вы также можете использовать класс для макета UserManager
и переопределить его методы с помощью имитированных методов:
public class MockUserManager : UserManager<TUser>
{
public MockUserManager(IUserStore<TUser> store, IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<TUser> passwordHasher, IEnumerable<IUserValidator<TUser>> userValidators,
IEnumerable<IPasswordValidator<TUser>> passwordValidators, ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<TUser>> logger)
: base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
{
}
public override Task<IdentityResult> CreateAsync(TUser user)
{
return Task.FromResult(IdentityResult.Success);
}
}
В конце концов вы можете издеваться над UserManager
с попутным издевались UserStore
:
var userStore = new MockUserStore();
var userManager = new MockUserManager(userStore,
new Mock<IOptions<IdentityOptions>>().Object,
new Mock<IPasswordHasher<AppUser>>().Object,
new IUserValidator<TUser>[0],
new IPasswordValidator<TUser>[0],
new Mock<ILookupNormalizer>().Object,
new Mock<IdentityErrorDescriber>().Object,
new Mock<IServiceProvider>().Object,
new Mock<ILogger<UserManager<TUser>>>().Object);
return userManager;