【问题标题】:When using Moq to mock an interface, what happens to the methods?使用 Moq 模拟接口时,方法会发生什么?
【发布时间】:2018-04-27 13:16:49
【问题描述】:

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

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

假设接口包含一个方法: string method();.

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

【问题讨论】:

  • 您需要将定义提供给something.Setup(m => method()).Returns("Return Value");等方法
  • 如果有可能运行类似var something = new Mock<ISomething>(); something.method() 并看到自己...

标签: c# testing moq


【解决方案1】:

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多