当使用 Moq 模拟接口(interface)时,方法会发生什么变化?
假设我有一个接口(interface) ISomething
, IoC 映射到类 Something
.然后在我的测试中我这样做:var something = new Mock<ISomething>();
.
假设接口(interface)包含一个方法:
string method();
.
现在,如果我在模拟实例上调用该方法,something.method()
, 它会被映射到类 Something
的实现,还是只会返回 void? Moq 会尝试将接口(interface)与实现映射吗?
最佳答案
Moq 不会尝试使用您的实现,事实上它对此一无所知(甚至不关心它是否存在)。相反,它在运行时生成它自己的类,它实现您的接口(interface) 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
接口(interface)的完全不同的实现(类)。您可以通过调用来检查:
var whatMySomethingIs = something.Object.GetType();
var whatMySomethingElseIs = somethingElse.Object.GetType();
关于c# - 使用 Moq 模拟接口(interface)时,方法会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50063283/