c# - 依赖于 HttpContext 的单元测试

标签 c# asp.net unit-testing httpcontext

我需要测试一些依赖于当前上下文的静态方法。现在,我当然可以使用 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 所以我需要一种方法来分配我的 HttpContextBaseHttpContext

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

最佳答案

在我看来,你应该用你注入(inject)的自定义接口(interface)方法替换对 SomeExternalAPIThatReliesOnHttpContextBeingSet 的调用,然后可以像其他任何方法一样模拟它。

关于c# - 依赖于 HttpContext 的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14780112/

相关文章:

c# - Asp.Net Web API 未从 Angular 接收 Post 数据

unit-testing - 我将如何生成适合 Jenkins/Hudson 使用的常规测试的 JUnit 测试报告?

c# - 如何使用指定行号的 LINQ 读取文本文件

c# - 发送时发生意外错误。传输流中的 EOF 或 0 字节

c# - Windows Phone 8 按钮点击颜色

Javascript ASP.net 将单选按钮在模式弹出窗口中启用为 false

java - 使用模拟资源请求进行单元测试

python - python 中的严格模拟

c# - 如何在与 C# 相同的 gRPC 中声明小数对象

c# - 为什么 lock(objLock) 比 lock(this) 更好