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 が null になります。これがないと、それに依存するメソッドを呼び出そうとすると、多くの NullReferenceExceptions が発生します。

さまざまな Web コンテキストをモックするスレッドが多数あります。これを確認できます: Moq を使用して ASP.NET MVC で HttpContext をモックするにはどうすればよいですか?

またはこれ は、Test Init Method の Mock HttpContext.Current です。

編集: 以下が機能します。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 に答える