2012-05-18 12 views
8

Quando si scrive l'unit test usando Moq in qualsiasi momento, chiamo lo Elmah.ErrorSignal.FromCurrentContext che fallisce con un'eccezione di riferimento null. Sono in grado di prendere in giro il ControllerContext e vorrei utilizzare solo un comando di log di errore come questo ..Elmah error logging FromCurrentContext si interrompe durante il test dell'unità

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

ma purtroppo la ControllerContext.HttpContext è di tipo HttpContextBase e non funzionerà con questo metodo la registrazione degli errori.

C'è un modo migliore per chiamare direttamente la registrazione degli errori di Elmah? Sfortunatamente l'oggetto Application.HttpContext non può essere deriso (sotto l'esempio) o servirebbe allo stesso scopo.

Mock Application e 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); 

errore prodotto:

configurazione non valido su un non-virtuale (superabile in VB) membro

+0

correlati: [Come posso prendere in giro la routine ErrorSignal di Elmah?] (Http://stackoverflow.com/questions/1019833/how-can-i-mock-elmahs-errorsignal-routine) –

risposta

7

Una cosa si può fare per registrare l'errore in modo diverso in Elmah è quello di utilizzare:

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

Anche se ciò non registrerà un errore dal test dell'unità, ma salterà almeno completamente la registrazione nel test dell'unità e continuerà a registrare l'errore in circostanze normali.

13

Anche se non si può deridere HttpContext, è possibile configurare HttpContext.Current nel test.

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

Non sono sicuro di quali parti del contesto vengono utilizzate da Elmah.

3a parte edit:
ELMAH richiede anche 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() 

altrimenti viene generata un'eccezione perché il nome dell'applicazione è NULL.

Ulteriori edit:
Ecco il codice finale in 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()}; 
Problemi correlati