Пересмотренные методы UserManager и roleManager возвращают ноль - PullRequest
2 голосов
/ 05 марта 2019

Я издевался над 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 () должен быть заменен фиктивным объектом и должен возвращать все, что мы сконфигурировали для возвращения фиктивного объекта.

Что я делаю неправильно?

Спасибо:)

1 Ответ

2 голосов
/ 06 марта 2019

Проблема с настройкой вашего макета. Если вы используете конкретный объект или значение moq, вы будете сравнивать экземпляры с помощью IEquatable.Equals. У вас есть следующие настройки:

mockedUserManager.Setup(x => x.FindByEmailAsync(email))
    .ReturnsAsync(new IdentityUser { UserName = email });

mockUserRoleStore.Setup(x => x.IsInRoleAsync(new IdentityUser() { UserName = email }, userRole, ct))
    .ReturnsAsync(true);

Поскольку вы каждый раз создаете новый экземпляр, ваши настройки никогда не совпадают. Попробуйте изменить вторую настройку на что-то вроде:

mockUserRoleStore.Setup(x => x.IsInRoleAsync(It.IsAny<IdentityUser>(), userRole, It.IsAny<CancellationToken>()))
    .ReturnsAsync(true);

или, более конкретно,

mockUserRoleStore.Setup(x => x.IsInRoleAsync(It.Is<IdentityUser>(u => u.UserName == email), userRole, It.IsAny<CancellationToken>()))
    .ReturnsAsync(true);

Обновление

Я заметил еще одну проблему, поскольку вы инициализируете mockedUserManager не с помощью смоделированного mockUserRoleStore, а с новым экземпляром mock:

var mockUserRoleStore = mockUserStore.As<IUserRoleStore<IdentityUser>>();
var mockedUserManager = new Mock<UserManager<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);
...