2012-05-18 16 views
8

Al escribir pruebas de unidades con Moq cada vez que llamo al Elmah.ErrorSignal.FromCurrentContext, falla con una excepción de referencia nula. Soy capaz de burlarse de la ControllerContext y me gustaría sólo tiene que utilizar un comando de registro de errores como este ..Registro de errores de Elmah FromCurrentContext se rompe al probar la unidad

Elmah.ErrorSignal.FromContext(ControllerContext.HttpContext).Raise(e); 

pero desafortunadamente el ControllerContext.HttpContext es de tipo HttpContextBase y no funcionará con este método de registro de errores.

¿Hay una mejor manera de llamar al registro de errores de Elmah directamente? Lamentablemente, el objeto Application.HttpContext no se puede burlar (a continuación del ejemplo) o eso también serviría para el propósito.

Mock Application y Application.HttpContext:

ctrlCtx.SetupGet(x => x.HttpContext.ApplicationInstance) 
      .Returns(new Mock<HttpApplication>().Object); 
ctrlCtx.SetupGet(x => x.HttpContext.ApplicationInstance.Context) 
      .Returns(new Mock<HttpContext>().Object); 

error producidos:

configuración no válida en un miembro no virtual (reemplazable en VB)

+0

relacionado: [¿Cómo puedo simular la rutina ErrorSignal de Elmah?] (Http://stackoverflow.com/questions/1019833/how-can-i-mock-elmahs-errorsignal-routine) –

Respuesta

7

Una cosa que puede hacer para registrar el error de forma diferente en Elmah es utilizar:

Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(e)); 

Aunque esto no registrará un error de la prueba unitaria, al menos omitirá el registro por completo en la prueba unitaria y aún registrará el error en circunstancias normales.

13

Aunque no se puede burlarse HttpContext, puede configure HttpContext.Current en su prueba.

var req = new HttpRequest(string.Empty, "https://www.domain.tld", null); 
var res = new HttpResponse(null); 
HttpContext.Current = new HttpContext(req, res); 

No estoy seguro de qué partes del contexto son utilizadas por Elmah though.

tercera parte de edición:
ELMAH también requiere System.Web.HttpContext.Current.ApplicationInstance

Dim req As System.Web.HttpRequest = New System.Web.HttpRequest(String.Empty, "https://www.domain.tld", Nothing) 
Dim res As System.Web.HttpResponse = New System.Web.HttpResponse(Nothing) 
System.Web.HttpContext.Current = New System.Web.HttpContext(req, res) 

System.Web.HttpContext.Current.ApplicationInstance = New System.Web.HttpApplication() 

de lo contrario, se produce una excepción, ya nombre de la aplicación es NULL.

Además de edición:
Aquí está el código final en C#:

var req = new HttpRequest(string.Empty, "https://www.domain.tld", null); 
var res = new HttpResponse(null); 
HttpContext.Current = new HttpContext(req, res) 
    {ApplicationInstance = new HttpApplication()}; 
Cuestiones relacionadas