2009-06-19 15 views
16

Estamos utilizando ELMAH para el manejo de errores en nuestra aplicación de C# ASP.Net MVC y en nuestras excepciones capturadas, estamos haciendo algo como esto:¿Cómo puedo simular la rutina ErrorSignal de Elmah?

ErrorSignal.FromCurrentContext().Raise(exception); 

pero cuando trato de unidad de prueba de las excepciones capturadas, Recibo este mensaje:

System.ArgumentNullException: Value cannot be null. 
Parameter name: context 

¿Cómo puedo simular la llamada FromCurrentContext()? ¿Hay algo más que debería estar haciendo en su lugar?

FYI ... Actualmente estamos utilizando Moq y RhinoMocks.

Gracias!

Respuesta

33

Dado que el método FromCurrentContext() es un método estático, no se puede simplemente simular la llamada. Tienes otras dos opciones.

  1. Desde FromCurrentContext() internamente hace una llamada a HttpContext.Current se puede empujar un contexto falso en eso. Por ejemplo:

    SimpleWorkerRequest request = new SimpleWorkerRequest(
        "/blah", @"c:\inetpub\wwwroot\blah", "blah.html", null, new StringWriter()); 
    
    HttpContext.Current= new HttpContext(request); 
    

    Con esto no se debe tirar la excepción más ya que HttpContext.Current no es nulo.

  2. Crea una clase contenedora alrededor de la llamada a Raise y simplemente burla la clase contenedora.

    public class ErrorSignaler { 
    
        public virtual void SignalFromCurrentContext(Exception e) { 
         if (HttpContext.Current != null) 
          Elmah.ErrorSignal.FromCurrentContext().Raise(e); 
        } 
    } 
    
+1

Gran primera respuesta Mateo, la bienvenida a SO –

+11

Esta es una pregunta más viejo, así tal vez las cosas han cambiado, pero para Elmah 1.1, tuve que inicializar también la HttpContext.Current.ApplicationInstance a un nuevo HttpApplication () para que esto funcione ¡Gracias! – PatrickSteele

+1

Otra opción es la siguiente: Dim req As System.Web.HttpRequest = New System.Web.HttpRequest (String.Empty, "https: //www.domain.tld", Nothing)
Dim res Como System.Web. HttpResponse = Nueva System.Web.HttpResponse (Nada)
System.Web.HttpContext.Current = Nueva System.Web.HttpContext (req, res)
System.Web.HttpContext.Current.ApplicationInstance = Nueva System.Web.HttpApplication()

Cuestiones relacionadas