我需要测试一些依赖于当前上下文的静态方法。现在,我当然可以使用 HttpContextWrapper
从我自己的代码中删除这种依赖性。问题在于我在这些方法中使用的第 3 方 API。他们依赖于 HttpContext
,所以我对此无能为力。但是,我想要做的是使用我的 HttpContextBase
设置 HttpContext
。
所以我的代码看起来像这样:
public static bool IsSignedUpUser()
{
//This calls IsSignedUpUser with the production context
return IsSignedUpUser(new HttpContextWrapper(HttpContext.Current));
}
public static bool IsSignedUpUser(HttpContextBase context)
{
HttpCookie objCookie = SomeExternalAPIThatReliesOnHttpContextBeingSet();
return (objCookie != null)
}
我想做的是:
HttpContext.Current = context; //where context is a mocked HttpContextBase
这样,当第 3 方 API 在 HttpContext
中查找查询字符串、cookie 值等时,它不会抛出 NullReferenceException
。
为什么这不是骗局?
在被引用为欺骗的问题的代码中,作者看起来完全可以控制,没有外部依赖。我正在使用依赖于 HttpContext
的第三方库,我无法更改它们的方法签名以接受 HttpContextBase
所以我需要一种方法来分配我的 HttpContextBase
到 HttpContext
。
如果这是不可能的,到目前为止我被引导相信它不是,那么好的答案应该建议如何删除这些依赖项。 500 - 内部服务器错误至少有一个好的建议。
最佳答案
在我看来,你应该用你注入(inject)的自定义接口(interface)方法替换对 SomeExternalAPIThatReliesOnHttpContextBeingSet 的调用,然后可以像其他任何方法一样模拟它。
关于c# - 依赖于 HttpContext 的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14780112/