如果没有默认构造函数,我如何在对象上模拟方法

本文关键字:对象 模拟 方法 默认 构造函数 如果没有 | 更新日期: 2023-09-27 17:59:32

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

我的替代方案是模拟IFoo,它解决了上述问题,但我无法构造它,因为Foo没有无参数构造函数(Constructor arguments cannot be passed for interface mocks.)。我能做什么?

如果没有默认构造函数,我如何在对象上模拟方法

您应该能够毫无问题地模拟IFoo,并且在模拟接口时没有理由传递参数。您的IFoo mock将完全是(一个mock!),并且不了解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();
    }
}