1

我正在测试一个在同一个类中调用另一个方法的方法。

根据此内部方法调用是否返回结果,我会做不同的事情。在这种情况下,它是一个Cache类,我正在测试我的GetOrStore方法。我想测试两条路径,何时Get返回 null 和何时Get返回something

Get控制调用时输出的正确方法是GetOrStore什么?感觉Get应该在模拟实例上执行但是我不确定如何在同一个类中给出两个方法来执行此操作。

更新

此时我唯一能想到的就是确保在运行测试之前删除缓存键:

  HttpRuntime.Cache.Remove("foo"); // Make sure foo isn't in the cache.

  var output = _cache.GetOrStore("foo", () => "Foo", 100);
  Assert.AreEqual(output, "Foo");

但这只是感觉不对。我实际上不希望在测试期间触及 HttpRuntime 缓存。

4

2 回答 2

1

答案在模拟CallBase实例的 Moqs 属性中。

设置CallBasetrue确保在模拟对象的真实实例上调用任何未明确设置的方法。

这意味着我们可以设置Get方法并且仍然GetOrStore正确执行:

  var _mockCache = new Mock<Cache>();
  _mockCache.Setup(m => m.Get(It.IsAny<string>())).Returns(null);
  _mockCache.CallBase = true;

  var output = _mockCache.Object.GetOrStore("foo", () => "Foo", 100);
  Assert.AreEqual("Foo", output);
于 2012-05-23T11:07:58.737 回答
0

您发布的代码暗示在您正在测试的缓存类中,Get 方法调用 HttpRuntime.Cache 上的静态方法。是这样吗?

通常最好避免像这样的可变静态状态。您可以创建一个包装 HttpRuntime.Cache 的代理类,并让您的 Cache 依赖于它的一个实例。然后在您的测试中,您可以使用可以轻松控制的模拟版本替换代理。

于 2012-05-23T11:00:21.953 回答