2012-01-05 13 views
19

Ho un codice che utilizza HostingEnvironment.MapPath che desidero testare unitamente.Come codice di test unitario che utilizza HostingEnvironment.MapPath

Come posso impostare HostingEnvironment in modo che restituisca un percorso e non null nel mio progetto di test unità (mstest)?

+0

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? –

+3

@DarinDimitrov: Perché non conoscevo HttpServerUtilityBase'. Puoi aggiungere un esempio? – jgauffin

risposta

15

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); 
} 
+6

Cosa succede se stiamo testando un 'ApiController' e non' MVC'? –

0

Dipende dal tipo di struttura di simulazione o isolamento che si sta utilizzando. Si potrebbe voler esaminare a) una creazione di un tipo di wrapper attorno alla proprietà statica che può essere derisa, o b) utilizzando un framework che può simulare proprietà statiche - ad es. Moles o Typemock Isolator

-4

basta usare questo codice ..

Fai un nuovo nome della cartella di riferimento nella directory principale e ha aggiunto il file all'interno di questa cartella.

Utilizzare questa

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; 
} 
0

Beh stavo scrivendo un test di oggi per il codice che io non controllo e hanno usato

private static String GetApplicationPath() 
    { 
     return HostingEnvironment.ApplicationVirtualPath.TrimEnd('/'); 
    } 

ecco un C# riflessione hack per impostare tale valore