使用Moq模拟接口时,方法会发生什么?

时间:2018-04-27 13:16:49

标签: c# testing moq

使用Moq模拟界面时,方法会发生什么?

假设我有一个interace ISomething,IoC映射到类Something。然后在我的测试中我这样做:var something = new Mock<ISomething>();

让我们说接口包含一个方法: string method();

现在,如果我在模拟的实例something.method()上调用该方法,它是否会映射到类Something的实现,还是只返回void? Moq会尝试使用实现映射接口吗?

1 个答案:

答案 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.ObjectsomethingElse.ObjectISomething接口的完全不同的实现(类)。您可以通过致电:

来检查
var whatMySomethingIs = something.Object.GetType();
var whatMySomethingElseIs = somethingElse.Object.GetType();