我有一些使用HostingEnvironment.MapPath
的代码,我想对其进行单元测试。
如何设置HostingEnvironment
,以便它在我的单元测试(mstest)项目中返回路径而不是null
?
最佳答案
为什么要在ASP.NET MVC应用程序中拥有依赖HostingEnvironment.MapPath的代码,在其中您可以访问诸如HttpServerUtilityBase之类的对象,从而可以实现此目的,并且可以轻松对其进行模拟和单元测试?
让我们举个例子:一个 Controller Action ,它使用我们要进行单元测试的抽象Server类:
public class HomeController : Controller
{
public ActionResult Index()
{
var file = Server.MapPath("~/App_Data/foo.txt");
return View((object)file);
}
}
现在,有很多方法可以对该 Controller Action 进行单元测试。我个人喜欢使用MVcContrib.TestHelper。
但是,让我们看看如何使用现成的模拟框架来做到这一点。我在这个例子中使用Rhino Mocks:
[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);
}
关于asp.net - 如何对使用HostingEnvironment.MapPath的代码进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8740498/