Perché si avere un codice che dipende da HostingEnvironment.MapPath in un'applicazione ASP.NET MVC in cui si ha accesso a oggetti come HttpServerUtilityBase che permettono di raggiungere questo obiettivo e che può essere facilmente deriso e unità di test?
Facciamo un esempio: un'azione di controllo che utilizza la classe astratta Server che vogliamo unit test:
public class HomeController : Controller
{
public ActionResult Index()
{
var file = Server.MapPath("~/App_Data/foo.txt");
return View((object)file);
}
}
Ora, ci sono molti modi per unit test questa azione di controllo. Personalmente mi piace usare lo MVcContrib.TestHelper.
Ma vediamo come possiamo farlo utilizzando una struttura di derisione pronta all'uso. Io uso Rhino Mocks per questo esempio:
[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);
}
fonte
2012-01-05 12:09:23
Perché si dovrebbe avere un codice che dipende da 'HostingEnvironment.MapPath' in un'applicazione ASP.NET MVC in cui si ha accesso a obj come HttpServerUtilityBase che ti permette di raggiungere questo obiettivo e che può essere facilmente deriso e testato? Forse potresti mostrare questo codice e spiegare lo scenario in modo che possiamo migliorarlo? –
@DarinDimitrov: Perché non conoscevo HttpServerUtilityBase'. Puoi aggiungere un esempio? – jgauffin