使用Moq模拟接口时,方法会发生什么?
假设我有一个接口ISomething,IoC映射到该类Something。然后在我的测试中,我这样做:var something = new Mock<ISomething>();。
可以说该接口包含一个方法:
string method();。
现在,如果我在模拟实例上调用该方法something.method(),它将被映射到类Something的实现,还是仅返回void?Moq是否会尝试将接口与实现映射?
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)
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |