Mocked SignInManager не работает должным образом - PullRequest
1 голос
/ 18 марта 2019

Я издеваюсь над процедурой входа в систему для идентификации asp.net и, к моему удивлению, _mockSignInManager.Setup( x => x.PasswordSignInAsync(It.IsAny<IdentityUser>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<bool>())).ReturnsAsync(SignInResult.Success);

не возвращает SignInResult.Success.В приведенном ниже коде var result возвращает null и ломает программу.Это очень странно для меня, потому что CreateAsync() с UserManager возвращает Task<IdentityResult>, а это PasswordSignInAsync() возвращает Task<SignInResult>.Тем не менее, этот другой тест работает нормально, а это не так.Код ниже:

LoginModelTests

[TestFixture]
public class LoginModelTests
{
    private Mock<FakeSignInManager> _mockSignInManager;
    private Mock<LoginModel.InputModel> _mockInputModel;

    [SetUp]
    public void SetUp()
    {
        _mockSignInManager = new Mock<FakeSignInManager>();
        _mockInputModel = new Mock<LoginModel.InputModel>();
        SetUpFakeSignInManager();
    }

    [Test]
    public async Task OnPostAsync_StateUnderTest_ExpectedBehavior()
    {
        // Arrange
        var unitUnderTest = new LoginModel(_mockSignInManager.Object, _mockInputModel.Object);

        // Act
        var result = await unitUnderTest.OnPostAsync("/asdsad/asda");
        var okResult = result as OkObjectResult;

        // Assert
        if (okResult != null && okResult.StatusCode == 200)
            Assert.Pass();
    }

    private void SetUpFakeSignInManager()
    {
        _mockSignInManager.Setup(
            x => x.PasswordSignInAsync(It.IsAny<IdentityUser>(), It.IsAny<string>(), It.IsAny<bool>(),
                It.IsAny<bool>())).Returns(Task.FromResult(SignInResult.Success));
    }

LoginModel

public class LoginModel : PageModel
{
    private readonly SignInManager<IdentityUser> _signInManager;

    public LoginModel(SignInManager<IdentityUser> signInManager, InputModel inputModel)
    {
        _signInManager = signInManager;
        Input = inputModel;
    }

    [BindProperty]
    public InputModel Input { get; set; }

    public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {
        returnUrl = returnUrl ?? Url.Content("~/");

        if (ModelState.IsValid)
        {
            var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
            if (result.Succeeded)
            {
                _logger.LogInformation("User logged in.");
                return LocalRedirect(returnUrl);
            }
        }
        return Page();
    }
}

1 Ответ

1 голос
/ 18 марта 2019

PasswordSignInAsync, который вы настроили для теста, и тот, который вызывается в тестируемом методе, имеют разные подписи.

Таким образом, вы устанавливаете неправильный метод.

Обновить настройки

_mockSignInManager.Setup(
    x => x.PasswordSignInAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(),
        It.IsAny<bool>())).Returns(Task.FromResult(SignInResult.Success));
...