2012-05-18 80 views
8

使用Moq随时编写单元测试时,我会调用Elmah.ErrorSignal.FromCurrentContext,它会失败并返回空引用异常。我可以嘲笑ControllerContext,我想只用一个错误日志命令,这样的..Elmah错误日志记录FromCurrentContext在单元测试时中断

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

可惜ControllerContext.HttpContextHttpContextBase型的,不会与此错误测井方法工作。

有没有更好的方法直接调用Elmah错误日志记录?不幸的是,Application.HttpContext对象不能被模拟(下面的例子),或者这也可以达到目的。

Application模拟和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); 

错误制作人:

在非虚拟(在VB重写)构件

无效设置

+0

相关:[我如何模拟Elmah的ErrorSignal例程?](http://stackoverflow.com/questions/1019833/how-can-i-mock-elmahs-errorsignal-routine) – 2014-12-17 10:14:58

回答

7

一件事是使用:

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

虽然这不会在单元测试中记录错误,它至少会在单元测试中完全跳过日志记录,并且在正常情况下仍会记录错误。

13

虽然无法嘲笑HttpContext的,可以在你的测试中设置HttpContext.Current。

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

我不确定Elmah使用上下文的哪些部分。

第三方编辑:
ELMAH还需要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() 

否则它抛出一个异常,因为应用程序名称为NULL。

进一步编辑:
这是在C#中的最终代码:

你可以做登录不同的ELMAH错误
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()};