2012-01-05 9 views
19

Tengo un código que usa HostingEnvironment.MapPath que me gustaría probar en una unidad.Cómo probar el código de unidad que usa HostingEnvironment.MapPath

¿Cómo puedo configurar HostingEnvironment para que devuelva una ruta y no null en mi proyecto de prueba unitaria (mstest)?

+0

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

+3

@DarinDimitrov: Porque no sabía de 'HttpServerUtilityBase'. ¿Puedes agregar un ejemplo? – jgauffin

Respuesta

15

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

¿Qué sucede si estamos probando un 'ApiController' y no uno' MVC'? –

0

Depende de qué marco de burla o de aislamiento está utilizando. Es posible que desee considerar a) la creación de un tipo de envoltorio alrededor de la propiedad estática que se puede burlar, o b) el uso de un marco que puede simular propiedades estáticas, p. Moles o Typemock Isolator

-4

sólo tiene que utilizar el código ..

hacer un nuevo nombre de la carpeta en el directorio raíz de referencia y ha añadido su archivo dentro de esta carpeta.

Utilice esta

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

Bueno, yo estaba escribiendo una prueba de hoy para el código que no controlo y utilizaron

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

asi que aquí hay una C# reflexión truco para fijar ese valor

var path = "/aaaa/bb"; 

HostingEnvironment hostingEnvironment; 
if (HostingEnvironment.IsHosted.isFalse()) 
    new HostingEnvironment(); 

hostingEnvironment = (HostingEnvironment)typeof(HostingEnvironment).fieldValue("_theHostingEnvironment"); 

var virtualPath = "System.Web".assembly() 
        .type("VirtualPath").ctor(); 

virtualPath.field("_virtualPath", path); 
//return virtualPath.prop("VirtualPathString");     
//return virtualPath.prop("VirtualPathStringNoTrailingSlash");     

hostingEnvironment.field("_appVirtualPath", virtualPath); 
//hostingEnvironment.field("_appVirtualPath") == virtualPath; 

return HostingEnvironment.ApplicationVirtualPath == path;  

//using System.Web.Hosting 
Cuestiones relacionadas