使用Moq模拟界面时,方法会发生什么?
假设我有一个interace ISomething
,IoC映射到类Something
。然后在我的测试中我这样做:var something = new Mock<ISomething>();
。
让我们说接口包含一个方法:
string method();
。
现在,如果我在模拟的实例something.method()
上调用该方法,它是否会映射到类Something
的实现,还是只返回void? Moq会尝试使用实现映射接口吗?
答案 0 :(得分:4)
Moq 没有尝试使用您的实施,事实上它对此一无所知(即使不关心它存在)。而是它在运行时生成它自己的类,它实现了您的接口ISomething
。它的实现是您使用something.Setup()
方法配置它的方法。
如果您跳过配置,它将只返回默认值而不执行任何其他操作。例如,
var something = new Mock<ISomething>();
var result = something.Object.method(); // returns NULL
var somethingElse = new Mock<ISomething>();
somethingElse.Setup(s=>s.method()).Returns("Hello World");
var otherResult = somethingElse.Object.method(); // Returns "Hello World"
设置可能非常复杂,如果您需要,包括为不同的参数返回不同的结果,或者针对不同的调用(第一次返回一个值,第二次调用 - 另一个)。有关详细信息,请查看documentation。
请注意,something.Object
和somethingElse.Object
是ISomething
接口的完全不同的实现(类)。您可以通过致电:
var whatMySomethingIs = something.Object.GetType();
var whatMySomethingElseIs = somethingElse.Object.GetType();