2009-06-19 20 views
16

Stiamo utilizzando ELMAH per la gestione degli errori nel nostro ASP.Net MVC C# e nelle nostre eccezioni catturati, stiamo facendo qualcosa di simile:Come posso prendere in giro la routine ErrorSignal di Elmah?

ErrorSignal.FromCurrentContext().Raise(exception); 

ma quando provo a unità di prova le eccezioni catturati, ottengo questo messaggio:

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

Come posso prendere in giro il FromCurrentContext() chiamo? C'è qualcos'altro che dovrei fare invece?

FYI ... Attualmente stiamo utilizzando Moq e RhinoMocks.

Grazie!

risposta

33

Poiché il metodo FromCurrentContext() è un metodo statico non è possibile semplicemente prendere in giro la chiamata. Hai altre due opzioni.

  1. Dal FromCurrentContext() fa internamente una chiamata a HttpContext.Current si può spingere un contesto falso in questo. Per esempio:

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

    Con questo non dovrebbe generare l'eccezione più da HttpContext.Current non è nullo.

  2. Creare una classe wrapper per la chiamata a Raise e solo prendere in giro la classe wrapper.

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

Grande prima risposta Matteo, benvenuto a SO –

+11

Questa è una domanda più vecchio quindi forse le cose sono cambiate, ma per Elmah 1.1, ho dovuto inizializzare anche il HttpContext.Current.ApplicationInstance ad un nuovo HttpApplication (per farlo funzionare. Grazie! – PatrickSteele

+1

Un'altra opzione è questa: Dim req As System.Web.HttpRequest = Nuovo System.Web.HttpRequest (String.Empty, "https: //www.domain.tld", Niente)
Dim res As System.Web. HttpResponse = New System.Web.HttpResponse (Nothing)
System.Web.HttpContext.Current = Nuovo System.Web.HttpContext (req, res)
System.Web.HttpContext.Current.ApplicationInstance = New System.Web.HttpApplication()

Problemi correlati