我正在测试一个在同一个类中调用另一个方法的方法。
根据此内部方法调用是否返回结果,我会做不同的事情。在这种情况下,它是Cache
类,我正在测试我的GetOrStore
方法。我想测试两条路径,当Get
返回null并且Get
返回某事时。
从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缓存。
答案 0 :(得分:1)
答案是在模拟实例上的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);
答案 1 :(得分:0)
您发布的代码暗示在您正在测试的缓存类中,Get方法在HttpRuntime.Cache上调用静态方法。是这种情况吗?
通常最好避免像这样的可变静态。您可以创建一个包装HttpRuntime.Cache的代理类,并让您的Cache依赖于它的实例。然后在测试中,您可以使用您可以轻松控制的模拟版本替换代理。