如何为Func创建Moq模拟

时间:2012-01-06 09:27:20

标签: c# mocking moq

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

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

但是无法弄清楚如何使用'Moq'框架来模拟它。

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

  

表达式不是方法调用:x =&gt;调用(x.someMethod)

  

在找不到给定参数的匹配构造函数   嘲笑的类型。 ----&GT; System.MissingMethodException:构造函数   输入'Owned`1Proxy40a9bf91815d4658ad2453298c903652'找不到。

1 个答案:

答案 0 :(得分:4)

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类的另一个方法的定义,如果将func作为输入参数并将其设置为包含对象的属性

enter  public class Container
{
    private IPersona _persona;

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

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