Я занимаюсь разработкой веб-приложения, и в веб-приложении также очень важны тесты.Мое веб-приложение встроено в .net Core, поэтому я тестирую с использованием xUnit.NET
. Я начал тестировать действие регистра моего контроллера учетной записи.Тест:
public class AccountControllerTests
{
private List<AppUser> users = new List<AppUser>();
[Fact]
public async Task TestSuccessFulRegistration()
{
UserManager<AppUser> userManager = Mocks.GetUserManager(users);
SignInManager<AppUser> signInManager = Mocks.GetSignInManager(users);
AccountController controller = new AccountController(userManager, signInManager, null);
RegisterUser user = new RegisterUser
{
UserName = "testemail@testdomein.tld",
Email = "testemail@testdomein.tld",
Password = "Test123@"
};
ActionResult<ApiResult> actionResult = await controller.Register(user);
ApiResult apiResult = actionResult.Value;
Assert.True(apiResult.Succeeded, "ApiResult should be Succeeded if username and email are unique.");
Assert.Empty(apiResult.Errors);
Assert.Empty(apiResult.Message);
Assert.Null(apiResult.Object);
}
[Fact]
public async Task TestRegistrationWithIncorrectPassword()
{
UserManager<AppUser> userManager = Mocks.GetUserManager(users);
SignInManager<AppUser> signInManager = Mocks.GetSignInManager(users);
AccountController controller = new AccountController(userManager, signInManager, null);
RegisterUser user = new RegisterUser
{
UserName = "testemail@testdomein.tld",
Email = "testemail@testdomein.tld",
Password = "Test"
};
ActionResult<ApiResult> actionResult = await controller.Register(user);
ApiResult apiResult = actionResult.Value;
Assert.False(apiResult.Succeeded, "Registration should fail if password does not have numbers and special symbols.");
Assert.NotEmpty(apiResult.Errors);
Assert.Empty(apiResult.Message);
Assert.Null(apiResult.Object);
}
}
Я создал статический класс Mocks
, который высмеивает UserManager<Appuser>
и SignInManager<AppUser>
. Теперь я попытался проверить регистрацию.В классе запуска моего приложения установлено, что пароль должен состоять из цифр и не буквенно-цифровых символов.Однако, если я использую test
в качестве пароля, userManager.createAsync возвращает true.Менеджер пользователя выглядит так:
public static UserManager<TUser> GetUserManager<TUser>(List<TUser> ls) where TUser : class
{
var store = new Mock<IUserStore<TUser>>();
var userManager = new Mock<UserManager<TUser>>(store.Object, null, null, null, null, null, null, null, null);
userManager.Object.UserValidators.Add(new UserValidator<TUser>());
userManager.Object.PasswordValidators.Add(new PasswordValidator<TUser>());
userManager.Setup(x => x.DeleteAsync(It.IsAny<TUser>()))
.ReturnsAsync(IdentityResult.Success);
userManager.Setup(x => x.CreateAsync(It.IsAny<TUser>(), It.IsAny<string>())).ReturnsAsync(IdentityResult.Success).Callback<TUser, string>((x, y) => ls.Add(x));
userManager.Setup(x => x.UpdateAsync(It.IsAny<TUser>())).ReturnsAsync(IdentityResult.Success);
return userManager.Object;
}
CreateAsync всегда возвращает успех, но я даже не знаю, как написать, что используются IOptions<Identity>
.