Я пишу модульный тест, используя 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
, чтобы проверить, что он перенаправляет на нужную страницу. Когда я отлаживаю модульный тест, я вижу:
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
Что я делаю не так?