依赖于HttpContext的单元测试

时间:2013-02-08 19:41:52

标签: c# asp.net unit-testing httpcontext

我需要测试一些依赖于当前上下文的静态方法。现在,我当然可以使用HttpContextWrapper从我自己的代码中删除此依赖项。问题在于我在这些方法中使用的第三方API。他们依赖于HttpContext所以我对此无能为力。但是,我要做的是将HttpContext设置为HttpContextBase

所以我的代码看起来像这样:

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

这样,当第三方API在HttpContext中查找查询字符串,cookie值等时,它不会抛出NullReferenceException

为什么这不是一个骗局?

在引用为dupe的问题中的代码中,作者看起来处于完全控制状态,没有外部依赖关系。我正在使用依赖于HttpContext的第三方库,我无法更改其方法签名以接受HttpContextBase,因此我需要一种方法将HttpContextBase分配给{{1} }}

如果这是不可能的,并且到目前为止,我认为它不是,那么好的答案应该建议如何删除这些依赖项。 500 - 内部服务器错误至少有一个很好的建议。

2 个答案:

答案 0 :(得分:4)

在我看来,您应该使用您注入的自定义接口方法替换对SomeExternalAPIThatReliesOnHttpContextBeingSet的调用,然后可以将其模拟为任何其他方法。

答案 1 :(得分:2)

[编辑]每个@jessehouwing,“Moles”现在是“Fakes”,这应该会改善你的Google-fu

啊,静态依赖......更糟糕的那种。

这可能有点矫枉过正,但我​​会考虑使用Moles(或者他们重命名为什么),这样可以覆盖 ANY 行为,静态,密封或除此以外;以下是一些细读链接:

相关问题