【问题标题】:How do you create a Moq mock for a Func如何为 Func 创建 Moq 模拟
【发布时间】:2012-01-06 09:27:19
【问题描述】:

我有以下 Func 方法,我需要模拟一下

Func<Owned<ISomeInterface>> someMethod { get; set; }

但不知道如何使用“Moq”框架来模拟它。

我在 SO 上读过类似的 post,但似乎仍然无法嘲笑它,它总是回来

表达式不是方法调用:x => Invoke(x.someMethod)

在 嘲讽型。 ----> System.MissingMethodException : 构造函数 找不到类型“拥有的`1Proxy40a9bf91815d4658ad2453298c903652”。

【问题讨论】:

  • 我已经阅读了关于stackoverflow的相关帖子
  • 这是否意味着这个问题应该作为重复关闭?请澄清这个问题是否得到解决..
  • 抱歉,这篇文章似乎对我没有帮助,因为它对我不起作用。我打算编辑问题,但不小心添加了评论。我现在更新了问题
  • 为什么要模拟这个 Func?这只是一个属性,您可以将其设置为任何满足签名的方法,然后调用它,不是吗?
  • @Helikaon,就我而言,我希望模拟一个序列,以便该方法在多次调用时返回不同的结果。我还想验证它被调用的次数。

标签: c# mocking moq


【解决方案1】:

Funct 被定义为一个属性,因此您应该在 Moq 中使用 SetupSet

public interface IPersona
{
    string nome { get; set; }
    string cognome { get; set; }
    Func<Owned<ISomeInterface>> somemethod { get; set; }

}

。在你的测试中:

您为 Func 创建一个模拟:

Func<Owned<ISomeInterface>> somemethodMock = () => new Mock<Owned<ISomeInterface>>().Object; 

然后您为包含 Func 作为属性的类设置模拟,并在 Set 方法上设置期望:

var obj = new Mock<IMyInterface>();
obj.SetupSet(x => x.somemethod = somemethodMock).Verifiable();

您为模拟创建容器对象:

//We pass the mocked object to the constructor of the container class
var container = new Container(obj.Object);
container.AnotherMethod(somemethodMock);
obj.VerifyAll();

这里是Container类的Another方法的定义,如果将func作为入参设置为包含对象的属性

enter  public class Container
{
    private IPersona _persona;

    public Container(IPersona persona)
    {
        _persona = persona;
    }

    public void AnotherMethod(Func<MyClass<IMyInterface>> myFunc)
    {
        _persona.somemethod = myFunc;
    }      
}

【讨论】:

  • 谢谢,这似乎奏效了。我现在被困在代码的下一行,大声笑,我有一个从另一个程序集调用的静态方法......它会结束吗;-)
  • 这很痛苦 :) 看看这个:blogs.clariusconsulting.net/kzu/how-to-mock-extension-methods 它涵盖了扩展方法,但考虑到它们是静态的,它应该适合,希望对您有所帮助。
  • AutofacContrib.Moq.dll 允许您通过 Mocking off Funcs 等做很多事情,而且似乎已经成功了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 2021-08-23
  • 2016-08-06
  • 1970-01-01
  • 2012-04-30
  • 2013-11-17
  • 2012-03-18
相关资源
最近更新 更多