2010-07-13 25 views
13

Estoy usando C# 4.0 y necesito probar un servicio unitariamente. La función dentro del servicio devuelve una ruta similar a la que esperaba, esta es la ruta que espero recuperar. Pero cuando ejecuto esta prueba me sale el error de que HttpContext.Current es NULL. ¿Qué puedo hacer para solucionar este problema para que se pueda ejecutar la prueba?Usando httpcontext en la prueba de unidad

[TestMethod] 
public void GetPathTest() 
{ 
    var expected = System.IO.Path.GetFullPath(HttpContext.Current.Server.MapPath("~/Certificates/")); 
    var path = _mockService.Setup(o => o.GetPath()).Returns(expected); 
} 

Respuesta

17

En el momento en que pueda No encuentro mi envoltorio completo para HttpContext que utilicé antes, pero en este momento simplemente creamos un contexto para una solicitud vacía y vamos desde allí, así:

SimpleWorkerRequest request = new SimpleWorkerRequest("","","", null, new StringWriter()); 
HttpContext context = new HttpContext(request); 

Luego, en la prueba de la unidad inicializar o en la propia unidad de prueba (antes de crear esperada) Es posible ajustar la corriente HttpContext de la siguiente manera:

HttpContext.Current = context; 

Después, simplemente profundizar en el contexto falsa y posible sessionstate falso, etc. según sea necesario.

(Editar: Esto es todo en VS2008, marco 3.5 por cierto).

+0

Gracias por la respuesta! Esto lo hizo, aunque modifiqué un poco la petición de trabajo simple agregando el camino correcto y las direcciones. – Rob

2

Puede intente buscar en los atributos creados para las pruebas unitarias ASP.Net, como

[HostType("ASP.NET")] 

Este link to MSDN tiene absolutamente un buen reportaje sobre ello

1

Estoy publicando esto como referencia. No es una solución fácil, y habla de Typing Pato (si grazna ..):

http://haacked.com/archive/2007/08/19/why-duck-typing-matters-to-c-developers.aspx

http://haacked.com/archive/2007/09/09/ihttpcontext-and-other-interfaces-for-your-duck-typing-benefit.aspx

Es relevante y digno de una lectura; porque no hay IHttpContext, no es posible crear una implementación del entorno de prueba, hasta que considere usar la biblioteca de Duck Typing aquí. Aunque esta no es una respuesta directa.

Espero que ayude.

2

Usted puede decorar su método de prueba con los siguientes atributos:

[TestMethod] 
[HostType("ASP.NET")] 
[UrlToTest("http://localhost:xxxx/")] 
[AspNetDevelopmentServerHost("$(SolutionDir)\\xxx\\", "/")] 
public void TestMethod() 
{ 
    ... 
} 

A continuación, añadir un archivo Default.aspx en su proj prueba de la unidad.

Dentro del método de prueba puede acceder fácilmente al HttpContext. Si desea depurar, es posible utilizar algunos rastros o interrumpir la ejecución de depuración con el System.Diagnostics.Debugger.break de instrucciones()

public void TestMethod() 
{ 
    System.Diagnostics.Debugger.Break(); 

    ... 
} 

y luego adjuntar depurador al proceso según ha explicado MSDN: https://msdn.microsoft.com/en-us/library/vstudio/c6wf8e4z(v=vs.100).aspx