【发布时间】:2019-08-06 19:03:15
【问题描述】:
我正在尝试模拟一个注册用户进行测试的类。在测试代码中,我可以看到它在下面的 callbackUrl 处明显失败。
PageModel 类有一个字段 IUrlHelper 声明为 Url。 IUrlHelper 接口有 5 个方法,NOT 包括 .Page()。模拟这 5 个很容易,但我不知道如何模拟扩展方法。
有人可以帮忙吗?多年来我一直坚持这一点。
注册模型
public class RegisterModel : PageModel
{
private readonly IUrlHelper _urlHelper;
public RegisterModel(
IUrlHelper urlHelper)
{}
public async Task<IActionResult> OnPostAsync(
string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { userId = "full code has IdentityUserCreated", code = "string" },
protocol: Request.Scheme);
LocalRedirect(returnUrl);
return Page();
}
}
注册模型测试
[TestFixture]
public class RegisterModelTests
{
private Mock<IUrlHelper> _mockUrlHelper;
[SetUp]
public void SetUp()
{
_mockUrlHelper = new Mock<IUrlHelper>();
SetUpUrlHelper();
}
public RegisterModel CreateRegisterModel()
{
return new RegisterModel(
_mockUrlHelper.Object
);
}
[Test]
public async Task GivenValidInput_OnPostAsync_CreatesANewUser()
{
// Arrange
var unitUnderTest = CreateRegisterModel();
// Act
var result = await unitUnderTest.OnPostAsync("/asdsad/asda");
// Assert
if (result != null)
Assert.Pass();
}
private void SetUpUrlHelper()
{
_mockUrlHelper.Setup(x => x.Page(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<IdentityUser>(),
It.IsAny<string>())).Returns("callbackUrl").Verifiable();
}
【问题讨论】:
-
1) 您将无法有效地对 Razor 页面进行单元测试。您应该使用测试服务器运行集成测试。 2)
Url.Page失败,因为没有HttpContext。没有必要模拟它,因为返回是一致的,你只需要确保有一个HttpContext。因此需要进行集成测试。 -
我同意,我在下面发布了一个选项,但这更像是最后的版本。在这种情况下,我会问自己我在测试什么,感觉就像你在测试 dotnet 库而不是你的代码。
-
@ChrisPratt @ICodeGorilla 就
HttpContext而言,这篇文章会解决这个问题吗? docs.microsoft.com/en-us/aspnet/core/test/… 。或者你会说集成测试仍然是要走的路? -
这就是为什么我稍微整理了一下我的陈述。如果您模拟所有依赖项,则可以进行单元测试,但是有很多,并且在某个时刻,您比实际代码正确模拟所有内容的测试更多。诸如 Razor 页面或控制器操作之类的东西实际上是事物的系统,进行集成测试更有意义。
-
@ICodeGorilla 谢谢我试试看!
标签: c# asp.net asp.net-core moq razor-pages