xUnit: настройка тестов с операторами - PullRequest
0 голосов
/ 19 сентября 2019

Я занимаюсь разработкой веб-приложения, и в веб-приложении также очень важны тесты.Мое веб-приложение встроено в .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>.

...