c# - 单元测试 HttpContext.Current.Cache 或 C# 中的其他服务器端方法?

标签 c# unit-testing nunit mocking

为使用 HttpContext.Current.Cache class 的类创建单元测试时,我在使用 NUnit 时出错。功能是基本的 - 检查一个项目是否在缓存中,如果不在,则创建它并将其放入:

if (HttpContext.Current.Cache["Some_Key"] == null) {
    myObject = new Object();
    HttpContext.Current.Cache.Insert("Some_Key", myObject);
}
else {
    myObject = HttpContext.Current.Cache.Get("Some_Key");
}

从单元测试中调用它时,遇到第一个 Cache 行时会失败并返回 NullReferenceException。在 Java 中,我会使用 Cactus测试服务器端代码。是否有可用于 C# 代码的类似工具? This SO question提到模拟框架——这是我测试这些方法的唯一方法吗?是否有类似的工具来为 C# 运行测试?

此外,我不检查 Cache 是否为 null,因为我不想专门为单元测试编写代码并假设它在服务器上运行时始终有效。这是有效的,还是我应该在缓存周围添加空值检查?

最佳答案

这样做的方法是避免直接使用 HttpContext 或其他类似的类,而代之以模拟。毕竟,您并不是要测试 HttpContext 是否正常运行(这是微软的工作),您只是要测试方法是否在它们应该调用的时候被调用。

步骤(如果您只是想了解技术而无需浏览大量博客):

  1. 创建一个接口(interface)来描述您要在缓存中使用的方法(可能是 GetItem、SetItem、ExpireItem 之类的方法)。称它为 ICache 或任何你喜欢的名字

  2. 创建一个实现该接口(interface)的类,并将方法传递给真正的 HttpContext

  3. 创建一个实现相同接口(interface)的类,就像模拟缓存一样。如果您关心保存对象,它可以使用字典或其他东西

  4. 更改您的原始代码,使其根本不使用 HttpContext,而只使用 ICache。然后,代码将需要获取 ICache 的实例 - 您可以在类构造函数中传递一个实例(这就是依赖注入(inject)的全部内容),或者将其粘贴到某个全局变量中。

  5. 在您的生产应用中,将 ICache 设置为您真正的 HttpContext-Backed-Cache,并在您的单元测试中,将 ICache 设置为模拟缓存。

  6. 利润!

关于c# - 单元测试 HttpContext.Current.Cache 或 C# 中的其他服务器端方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/489819/

相关文章:

c# - BinaryReader 的 FillBuffer 方法有什么作用?

f# - 由于 F# 库中的 DLL 加载问题,NUnit 测试失败

c# - 为什么使用类级访问修饰符而不是对象级?

c# - 如何处理 xamarin 表单中的 "The GenerateResourceDesigner task failed unexpectedly"错误?

c# - 字符之一匹配的断行

c# - 如何使用 NUnit Test 对 uwp 应用程序进行单元测试

unit-testing - 集成测试应该模拟什么?

unit-testing - 在MSTest中使用继承

c# - 获取 NUnit 断言失败消息

.net - 如何使用 NAnt 0.86 beta 运行 NUnit v2.4.8 测试?