ユニットテストをしたいHostingEnvironment.MapPath
を使用するコードがあります。HostingEnvironment.MapPathを使用するテストコードをユニット化する方法
HostingEnvironment
は、ユニットテスト(mstest)プロジェクトでnull
ではなくパスを返すように設定するにはどうすればよいですか?
ユニットテストをしたいHostingEnvironment.MapPath
を使用するコードがあります。HostingEnvironment.MapPathを使用するテストコードをユニット化する方法
HostingEnvironment
は、ユニットテスト(mstest)プロジェクトでnull
ではなくパスを返すように設定するにはどうすればよいですか?
は、なぜあなたはあなたがこれを達成することができ、容易に嘲笑し、ユニットをテストできる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);
}
'MVC'ではなく' ApiController'をテストしているならどうしますか? –
これは、使用しているモックまたは分離フレームワークによって異なります。 a)模擬することができる静的プロパティの周りにラッパータイプを作成するか、b)静的プロパティをモックすることができるフレームワークを使用するかを調べることができます。 MolesまたはTypemock Isolator
はちょうどこのコードを使用すると、このフォルダ内のファイルを追加しました:私は、この例では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;
}
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
なぜあなたはobjにアクセスできるASP.NET MVCアプリケーションの 'HostingEnvironment.MapPath'に依存するコードを持っていますか? 'HttpServerUtilityBase'のような、あなたがこれを達成するのを可能にし、簡単に嘲笑され、ユニットテストされることができますか?多分あなたはこのコードを見せて、それを改善できるようにシナリオを説明できますか? –
@DarinDimitrov:私は 'HttpServerUtilityBase'を知りませんでした。あなたは例を追加できますか? – jgauffin