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

ptf*_*ptf 1 c# testing moq

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

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

可以说该接口包含一个方法: string method();。

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

Sas*_*sha 5

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"
Run Code Online (Sandbox Code Playgroud)

如果需要,设置可能会非常复杂,包括针对不同的参数或针对不同的调用返回不同的结果(第一次返回一个值,第二次调用-返回另一个)。有关更多详细信息,请查阅文档。

请注意,something.Object和somethingElse.Object是完全不同的ISomething接口实现(类)。您可以通过以下方式进行检查:

var whatMySomethingIs = something.Object.GetType();
var whatMySomethingElseIs = somethingElse.Object.GetType();
Run Code Online (Sandbox Code Playgroud)