3

我有一些UrlHelper我想进行单元测试的扩展方法。但是,当路径以“~/”开头时,我NullReferenceException会从方法中得到一个。UrlHelper.Content(string)有谁知道是什么问题?

[Test]
public void DummyTest()
{
    var context = new Mock<HttpContextBase>();
    RequestContext requestContext = new RequestContext(context.Object, new RouteData());
    UrlHelper urlHelper = new UrlHelper(requestContext);

    string path = urlHelper.Content("~/test.png");

    Assert.IsNotNullOrEmpty(path);
}
4

1 回答 1

10

当您使用 RouteContext 创建 UrlHelper 时,HttpContext 在您的单元测试环境中为空。如果没有它,当您尝试调用任何依赖它的方法时,您会遇到很多 NullReferenceExceptions。

有许多关于模拟各种 Web 上下文的线程。您可以查看这个: 如何使用 Moq 在 ASP.NET MVC 中模拟 HttpContext?

或者这个 Mock HttpContext.Current in Test Init Method

编辑: 以下将起作用。请注意,您需要模拟 HttpContext.Request.ApplicationPath 和 HttpContext.Response.ApplyAppPathModifier()。

[Test]
public void DummyTest() {
    var context = new Mock<HttpContextBase>();
    context.Setup( c => c.Request.ApplicationPath ).Returns( "/tmp/testpath" );
    context.Setup( c => c.Response.ApplyAppPathModifier( It.IsAny<string>( ) ) ).Returns( "/mynewVirtualPath/" );
    RequestContext requestContext = new RequestContext( context.Object, new RouteData() );
    UrlHelper urlHelper = new UrlHelper( requestContext );

    string path = urlHelper.Content( "~/test.png" );

    Assert.IsNotNullOrEmpty( path );
}

我在以下线程中找到了详细信息: ASP.NET 虚拟路径在哪里解析波浪号“~”?

于 2012-10-03T00:59:41.103 回答