Зачем вам нужен код, который зависит от HostingEnvironment.MapPath в приложении ASP.NET MVC, где у вас есть доступ к объектам, таким как HttpServerUtilityBase, которые позволяют вам достичь этого и которые можно легко смоделировать и протестировать на модуле?1002 * Давайте рассмотрим пример: действие контроллера, использующее абстрактный класс Server, который мы хотим выполнить модульным тестом:
public class HomeController : Controller
{
public ActionResult Index()
{
var file = Server.MapPath("~/App_Data/foo.txt");
return View((object)file);
}
}
Теперь существует много способов модульного тестирования этого действия контроллера.Лично мне нравится использовать 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);
}