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

| 使用moq,如果我尝试直接在
Foo
上模拟方法,则会得到:
Invalid verify on a non-virtual (overridable in VB) member.
我的替代方法是模拟
IFoo
,它摆脱了上述问题,但后来我无法构造它,因为
Foo
没有无参数的构造函数(
Constructor arguments cannot be passed for interface mocks.
)。我能做什么?     
已邀请:
        您应该能够毫无问题地模拟IFoo,并且在模拟接口时也没有理由传递参数。您的IFoo模拟将完全是(模拟!),并且不了解Foo或任何实际的实现,因此传递构造函数参数将毫无意义。 编辑:我要补充一点,如果存在一个接口,则模拟一个接口几乎总是比模拟一个具体实现更好。如果您只有一个具体的实现,那么您想要模拟它的事实可能意味着它将是添加接口的理想选择。     
        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();
    }
}
    

要回复问题请先登录注册