¿Por qué tener un código que depende de HostingEnvironment.MapPath en una aplicación ASP.NET MVC donde se tiene acceso a los objetos como HttpServerUtilityBase que le permiten lograr esto y que puede ser fácilmente burlado y análisis unidad?
Tomemos un ejemplo: una acción de controlador que utiliza la clase abstracta servidor que queremos prueba de unidad:
public class HomeController : Controller
{
public ActionResult Index()
{
var file = Server.MapPath("~/App_Data/foo.txt");
return View((object)file);
}
}
Ahora, hay muchas formas de unidad de prueba de esta acción del controlador. Personalmente me gusta usar el MVcContrib.TestHelper.
Pero veamos cómo podemos hacer esto usando un marco de burla listo para usar. Yo uso burla de Rhino para este ejemplo:
[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);
}
¿Por qué tendría un código que depende de 'HostingEnvironment.MapPath' en una aplicación ASP.NET MVC donde tiene acceso a obj efectos como 'HttpServerUtilityBase' que le permiten lograr esto y que pueden ser fácilmente burlados y probados en unidades? ¿Tal vez podría mostrar este código y explicar el escenario para que podamos mejorarlo? –
@DarinDimitrov: Porque no sabía de 'HttpServerUtilityBase'. ¿Puedes agregar un ejemplo? – jgauffin