【问题标题】:how to create mock or fake HttpContext.Current.Application for doing Nunit testing of controller [duplicate]如何创建模拟或伪造 HttpContext.Current.Application 以对控制器进行 Nunit 测试 [重复]
【发布时间】:2017-07-17 03:38:59
【问题描述】:

我们已经开发了一个 ASP.NET MVC 应用程序。我们被告知使用 NUnit 编写单元测试用例。

这就是应用程序的开发方式。

1) 在Global.asaxSession_Start 中,我们访问数据库并从数据库中获取一些查找值并将其放入

HttpContext.Current.Application["lookup"]=(dbvalues);

2) 在控制器的 ActionMethods 和其他一些类验证方法中,我们从 Application["lookup"] 获取值。

我们将Application["lookup"] 分配给Viewbag,这将用于在视图中列出值。

例如:我们将放入Application["lookup"] 的商店列表,并在控制器的Index 方法中分配ViewBag.Stores =Application["lookup"]

现在我们被告知为每个控制器方法编写 Nunit 测试用例。

我们创建了假的或模拟的HttpContext,但问题在于Httpcontext.current.Application

例如,我们在 Nunit 测试方法中创建了 Httpcontext.Current.Application["lookup"]="values",但是当它遇到控制器 Index 方法时,Application["lookup"] 不存在。请帮助如何创建假Httpcontext.current.Application["lookup"]

【问题讨论】:

  • 你为什么使用Application?为什么不使用依赖注入?模拟起来会容易得多。
  • HttpContext 使单元测试变得困难。抽象出您需要的功能并在需要的地方注入/解决。

标签: c# asp.net-mvc unit-testing asp.net-mvc-4 nunit


【解决方案1】:

不要直接使用任何 HttpContext,而是围绕您使用的功能编写一个包装器,以便您可以轻松地模拟它。

对于示例,在您当前的情况下查找数据,您需要创建一个接口,该接口将环绕提取该数据的逻辑。

public interface IApplicationDataHelper
{
    LookupData GetApplicationLookupData();
}

您将使用的课程将如下所示:

class ApplicationDataHelper
{
    LookupData GetApplicationLookupData()
    {
        return HttpContext.Current.Application["lookup"];
    }
}

(请根据它们提供的数据命名类和接口,这只是一个例子)。

我已经简化了它,但这就是想法。现在,您拥有的每个控制器/类都将依赖于IApplicationDataHelper,而不是直接依赖于静态HttpContext。在您的测试中,您将模拟 IApplicationDataHelper 以返回您想要的任何内容。

这是针对这种情况的通用方法,生成的代码也更易于维护。

单元测试应该在代码之前编写是有原因的,如果代码已经到位,提取规范可能需要很多时间......

【讨论】:

  • 请提供一些代码或想法
  • 我添加了一个例子。如果仍然不清楚 - 您应该阅读一般的单元测试和 DI。将职责分配给不同的类很重要
猜你喜欢
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2018-06-30
  • 1970-01-01
  • 2019-12-31
  • 2011-06-29
  • 1970-01-01
相关资源
最近更新 更多