. NET Страницы бритвенного теста основного модуля RedirectToPage () - PullRequest
2 голосов
/ 14 марта 2020

Я пишу модульный тест, используя MSTest и Moq для следующего метода обработчика Razor Page:

public async Task<IActionResult> OnPostAsync()
{
    if (ModelState.IsValid)
    {
        var user = await _userManager.FindByEmailAsync(Input.Email);

        if (user == null)
        {
            return Page();
        }

        // Trying to unit test this code here
        if (!await _userManager.IsEmailConfirmedAsync(user))
        {
            return RedirectToPage("/Account/EmailNotConfirmed");
        }

        var code = await _userManager.GeneratePasswordResetTokenAsync(user);
        code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
        var callbackUrl = Url.ResetPasswordCallbackLink(user.Id.ToString(), code, Request.Scheme);
        var callbackLink = HtmlEncoder.Default.Encode(callbackUrl);

        await _emailService.SendRazorTemplateEmailAsync(Input.Email, EmailTemplate.ResetPassword, new {Link = callbackUrl});

        return RedirectToPage("/Account/ForgotPasswordSuccess", new { email = Input.Email });
    }

    return Page();
}

Я пытаюсь написать модульный тест для блока кода, где await _userManager.IsEmailConfirmedAsync(user) возвращает false и RedirectToPage(). Вот мой код модульного теста:

private Mock<IEmailService>  _emailService;
private Mock<ILogger<ForgotPasswordModel>>  _logger;
private Mock<UserManager<ApplicationUser>> _userManager;
private Mock<IUserStore<ApplicationUser>> _userStore;
private ForgotPasswordModel _pageModel;

public ForgotPasswordTests()
{
    _emailService = new Mock<IEmailService>();
    _logger = new Mock<ILogger<ForgotPasswordModel>>();
    _userStore = new Mock<IUserStore<ApplicationUser>>();
    _userManager = new Mock<UserManager<ApplicationUser>>(_userStore.Object, null, null, null, null, null, null, null, null);
    _pageModel = new ForgotPasswordModel(_emailService.Object, _logger.Object, _userManager.Object);
}

[TestMethod]
public async Task OnPostAsync_WhenUserHasNotConfirmedEmail_RedirectsToCorrectPage()
{
    // Arrange
    _pageModel.Input = new ForgotPasswordPageModel() { Email = "johndoe@email.com" };
    _userManager.Setup(x => x.FindByEmailAsync(It.IsAny<string>())).ReturnsAsync(new ApplicationUser());
    _userManager.Setup(x => x.IsEmailConfirmedAsync(It.IsAny<ApplicationUser>())).ReturnsAsync(false);

    // Act
    var result = await _pageModel.OnPostAsync();

    // Assert
    Assert.IsInstanceOfType(result, typeof(RedirectToPageResult));
    Assert.AreEqual("/Account/EmailNotConfirmed", result.PageName); //<-- Error Here
}

Я пытаюсь написать оператор Assert, чтобы проверить, что он перенаправляет на нужную страницу. Когда я отлаживаю модульный тест, я вижу:

enter image description here

PageName = /Account/EmailNotConfirmed, но когда я пытаюсь сделать из этого оператор Assert, Я получаю следующую ошибку:

'IActionResult' does not contain a definition for 'PageName' and no accessible extension method 'PageName' accepting a first argument of type 'IActionResult' could be found

Что я делаю не так?

1 Ответ

1 голос
/ 14 марта 2020

Вам нужно привести результат к соответствующему типу, чтобы получить доступ к нужным членам

//...

// Act
IActionResult result = await _pageModel.OnPostAsync();

// Assert
Assert.IsInstanceOfType(result, typeof(RedirectToPageResult));
RedirectToPageResult redirect = result as RedirectToPageResult; //<--cast here
Assert.AreEqual("/Account/EmailNotConfirmed", redirect.PageName);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...