次のRazorPageハンドラーメソッドを使用して、単体テストを作成MSTest
しMoq
ています。
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 = "[email protected]" };
_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
私は何が間違っているのですか?
目的のメンバーにアクセスするには、結果を適切なタイプにキャストする必要があります
//...
// 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);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加