控制同一类中方法的输出

本文关键字:方法 输出 一类 控制 | 更新日期: 2023-09-27 18:34:58

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

根据此内部方法调用是否返回结果,我执行不同操作。在这种情况下,这是一个Cache类,我正在测试我的GetOrStore方法。我想测试两条路径,当Get返回 null 时,当 Get 返回某些内容时。

GetOrStore调用时控制Get输出的正确方法是什么?感觉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 缓存。

控制同一类中方法的输出

这个问题的答案在模拟实例的 Moqs CallBase属性中。

CallBase设置为 true 可确保在模拟对象的实际实例上调用任何非显式设置的方法。

这意味着我们可以设置 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);

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

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