我试图模拟类的某些方法,同时保留其他方法的真实实现。
现在,我确实在 stackoverflow 上找到了相关内容here。但是,所有建议的答案都没有帮助我。
在大多数情况下,Lee 的答案可能很好,但在我的情况下是不合适的,因为我确实需要模拟一个接口(它有各种实现)而不是类本身。
布兰登的答案非常接近,但我发现了以下问题。
为了方便起见,粘贴了他的代码:
var mock = new Mock<ITestClass>(); // Create Mock of interface
// Create instance of ITestClass implementation you want to use
var inst = new ActualTestClass();
// Setup to call method of an actual instance
// if method returns void use mock.Setup(...).Callback(...)
mock.Setup(m => m.SomeMethod(It.IsAny<int>())
.Returns((int x) => inst.SomeMethod(x));
导致我出现问题的是,这个示例适用于简单的场景,但如果“SomeMethod()”调用 ITestClass 中具有模拟设置的另一个方法,则它将不起作用。在这种情况下,“SomeMethod()”仍将使用真正的实现。
为了清楚起见:
假设 ITestClass 实现了方法 SomeMethod 和 SomeOtherMethod。前者必须调用后者,后者被嘲笑为:
mock.Setup(m => m.SomeOtherMethod(It.IsAny<bool>())
.Returns(true);
现在 SomeMethod 如何使用这个模拟而不是真正的实现呢?
EDIT
我需要模拟接口而不是类本身的另一个原因是,如果 TestClass() 是单例,则后一个选项将不允许您测试 TestClass() 。