2012-01-05 15 views
19

ユニットテストをしたいHostingEnvironment.MapPathを使用するコードがあります。HostingEnvironment.MapPathを使用するテストコードをユニット化する方法

HostingEnvironmentは、ユニットテスト(mstest)プロジェクトでnullではなくパスを返すように設定するにはどうすればよいですか?

+0

なぜあなたはobjにアクセスできるASP.NET MVCアプリケーションの 'HostingEnvironment.MapPath'に依存するコードを持っていますか? 'HttpServerUtilityBase'のような、あなたがこれを達成するのを可能にし、簡単に嘲笑され、ユニットテストされることができますか?多分あなたはこのコードを見せて、それを改善できるようにシナリオを説明できますか? –

+3

@DarinDimitrov:私は 'HttpServerUtilityBase'を知りませんでした。あなたは例を追加できますか? – jgauffin

答えて

15

は、なぜあなたはあなたがこれを達成することができ、容易に嘲笑し、ユニットをテストできるHttpServerUtilityBaseようなオブジェクトへのアクセス権を持っているASP.NET MVCアプリケーションでHostingEnvironment.MapPathに依存したコードを持っているでしょうか?

はのは例を見てみましょう:私たちはユニットテストしたい抽象サーバークラス使用するコントローラのアクション:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var file = Server.MapPath("~/App_Data/foo.txt"); 
     return View((object)file); 
    } 
} 

を、ユニットテスト、このコントローラのアクションには多くの方法があります。個人的にはMVcContrib.TestHelperを好きです。

しかし、私たちがどのように嘲笑フレームワークを使ってこれを行うことができるかを見てみましょう。

は、ルートディレクトリに新しいフォルダ名を参照してください。..

[TestMethod] 
public void Index_Action_Should_Calculate_And_Pass_The_Physical_Path_Of_Foo_As_View_Model() 
{ 
    // arrange 
    var sut = new HomeController(); 
    var server = MockRepository.GeneratePartialMock<HttpServerUtilityBase>(); 
    var context = MockRepository.GeneratePartialMock<HttpContextBase>(); 
    context.Expect(x => x.Server).Return(server); 
    var expected = @"c:\work\App_Data\foo.txt"; 
    server.Expect(x => x.MapPath("~/App_Data/foo.txt")).Return(expected); 
    var requestContext = new RequestContext(context, new RouteData()); 
    sut.ControllerContext = new ControllerContext(requestContext, sut); 

    // act 
    var actual = sut.Index(); 

    // assert 
    var viewResult = actual as ViewResult; 
    Assert.AreEqual(viewResult.Model, expected); 
} 
+6

'MVC'ではなく' ApiController'をテストしているならどうしますか? –

0

これは、使用しているモックまたは分離フレームワークによって異なります。 a)模擬することができる静的プロパティの周りにラッパータイプを作成するか、b)静的プロパティをモックすることができるフレームワークを使用するかを調べることができます。 MolesまたはTypemock Isolator

-4

はちょうどこのコードを使用すると、このフォルダ内のファイルを追加しました:私は、この例ではRhinoのモックを使用しています。

使用このまあ、C#の反射がその値を設定することがハックされて、私は私が管理していないコードのテスト今日を書いていたし、彼らはので、ここで

private static String GetApplicationPath() 
    { 
     return HostingEnvironment.ApplicationVirtualPath.TrimEnd('/'); 
    } 

を使用

public static XElement GetFile() 
{ 
    HttpContext.Current = new HttpContext(new HttpRequest("", "http://www.google.com", ""), new HttpResponse(new StringWriter())); 

    var doc = new XmlDocument(); 
    var file = HttpContext.Current.Server.MapPath("\\") + "abc.xml"; 
    doc.Load(file); 
    var e = XElement.Load(new XmlNodeReader(doc)); 
    return e; 
} 
0

var path = "/aaaa/bb"; 

HostingEnvironment hostingEnvironment; 
if (HostingEnvironment.IsHosted.isFalse()) 
    new HostingEnvironment(); 

hostingEnvironment = (HostingEnvironment)typeof(HostingEnvironment).fieldValue("_theHostingEnvironment"); 

var virtualPath = "System.Web".assembly() 
        .type("VirtualPath").ctor(); 

virtualPath.field("_virtualPath", path); 
//return virtualPath.prop("VirtualPathString");     
//return virtualPath.prop("VirtualPathStringNoTrailingSlash");     

hostingEnvironment.field("_appVirtualPath", virtualPath); 
//hostingEnvironment.field("_appVirtualPath") == virtualPath; 

return HostingEnvironment.ApplicationVirtualPath == path;  

//using System.Web.Hosting 
関連する問題