如何在没有默认构造函数的情况下模拟对象上的方法?

时间:2011-06-18 05:09:17

标签: c# moq

使用moq,如果我尝试直接在Foo上模拟方法,我会得到:Invalid verify on a non-virtual (overridable in VB) member.

我的替代方案是模拟IFoo,它摆脱了上述问题,但后来我无法构造它,因为Foo没有无参数的构造函数(Constructor arguments cannot be passed for interface mocks.)。我该怎么办?

2 个答案:

答案 0 :(得分:7)

您应该可以毫无问题地模拟IFoo,并且在模拟接口时没有理由传递参数。你的IFoo模拟就是那个(一个模拟!),并且不知道Foo或任何真正的实现,所以传递构造函数参数是没有意义的。

编辑:我想补充说,如果一个接口存在,那么模拟一个接口几乎总是比模拟一个具体的实现更好。如果你只有一个具体的实现,你想要模拟它的事实可能意味着它将是一个很好的候选添加接口。

答案 1 :(得分:0)

Moq创建了一个代理对象,要求所有模拟的方法都是可覆盖的,并且您的类没有被密封。因此,您可以将方法标记为虚拟。

以下代码可以正常使用:

public interface IFoo
{
    int Test(int myParameter);
    int TestInternal(int myParameter);
}

public class Foo : IFoo
{
    private int _someConstructorArgument;

    public Foo(int someConstructorArgument)
    {
        _someConstructorArgument = someConstructorArgument;
    }

    public virtual int Test(int myParameter)
    {
        return _someConstructorArgument + TestInternal(myParameter);
    }

    public virtual int TestInternal(int myParameter)
    {
        return myParameter;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        var mock = new Mock<Foo>(MockBehavior.Loose, 50);

        mock.Setup(x => x.TestInternal(100))
            .Returns(200);

        mock.CallBase = true;

        Console.WriteLine(mock.Object.Test(100));
        Console.ReadLine();
    }
}