usar unit test net mvc con como bootstrap asp asp.net asp.net-mvc-3 unit-testing

asp.net - unit - como usar bootstrap en asp net mvc



Cómo unificar el código de prueba que usa HostingEnvironment.MapPath (4)

Tengo un código que utiliza HostingEnvironment.MapPath que me gustaría probar por unidad.

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


¿Por qué tendría un código que depende de HostingEnvironment.MapPath en una aplicación MVC de ASP.NET donde tiene acceso a objetos como HttpServerUtilityBase que le permiten lograr esto y que se puede burlar y probar fácilmente?

Tomemos un ejemplo: una acción de controlador que usa la clase abstracta de servidor que queremos probar por unidad:

public class HomeController : Controller { public ActionResult Index() { var file = Server.MapPath("~/App_Data/foo.txt"); return View((object)file); } }

Ahora, hay muchas maneras de probar de forma unitaria esta acción del controlador. Personalmente me gusta usar el MVcContrib.TestHelper .

Pero veamos cómo podemos hacer esto utilizando un marco de burla fuera de la caja. Yo uso Rhino Mocks 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); }


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

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

Así que aquí hay un truco de reflexión de C # para establecer 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


Dependerá de qué marco de burla o aislamiento esté utilizando. Es posible que desee buscar en a) la creación de un tipo de envoltorio alrededor de la propiedad estática que se puede simular, o b) utilizando un marco que puede simular propiedades estáticas, por ejemplo, topos o aislador de Typemock


Solo usa este código ..

Haga una nueva referencia de nombre de carpeta en el directorio raíz y agregue su archivo dentro de esta carpeta.

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