当使用 Moq 编写单元测试时,每当我调用 Elmah.ErrorSignal.FromCurrentContext
时,它都会失败并出现空引用异常。我能够模拟 ControllerContext
并且我想只使用这样的错误日志命令..
Elmah.ErrorSignal.FromContext(ControllerContext.HttpContext).Raise(e);
但不幸的是,ControllerContext.HttpContext
的类型为 HttpContextBase
,并且无法使用此错误日志记录方法。
有没有更好的方法直接调用 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 中可重写)成员上的设置无效
最佳答案
虽然您无法模拟 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# 中的最终代码:
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()};
关于asp.net-mvc-3 - Elmah 错误日志记录 FromCurrentContext 在单元测试时中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10657961/