重定向调用实现Moq的mock on interface

时间:2014-08-04 09:09:10

标签: mocking moq

我有一个界面

public interface IFoo
{
    int Int();
    string String();
}

和一些实现

public class FooImpl : IFoo
{
    public int Int()
    {
        return 2;
    }

    public string String()
    {
        return "foo";
    }
}

现在我想使用Moq为IFoo创建一个模拟,但是如果没有提供Setup,模拟应该调用FooImpl中的实现。到目前为止,我尝试使用CallBase,但没有成功。

var mockBase = new Mock<FooImpl>();
var mock = mockBase.As<IFoo>();
mock.CallBase = true;

mock.Setup(x => x.Int()).Returns(10);
Console.WriteLine(mock.Object.Int());
Console.WriteLine(mock.Object.String());

通过此设置,我想获得10(来自Setup的值)和fooFooImpl的实现)。

我可以在旁边创建FooImpl的实例,模拟IFoo并首先委派所有调用,然后执行Setup调用。但这似乎是不必要的工作,特别是对于更大的接口。

1 个答案:

答案 0 :(得分:0)

CallBase在这里不起作用,因为模拟对象无法覆盖String()方法,因为它不是virtual

将班级更改为

public class FooImpl : IFoo
{
    public virtual int Int()
    {
        return 2;
    }

    public virtual string String()
    {
        return "foo";
    }
}

它将按预期工作。