我有一个界面
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
的值)和foo
(FooImpl
的实现)。
我可以在旁边创建FooImpl
的实例,模拟IFoo
并首先委派所有调用,然后执行Setup
调用。但这似乎是不必要的工作,特别是对于更大的接口。
答案 0 :(得分:0)
CallBase
在这里不起作用,因为模拟对象无法覆盖String()
方法,因为它不是virtual
。
将班级更改为
public class FooImpl : IFoo
{
public virtual int Int()
{
return 2;
}
public virtual string String()
{
return "foo";
}
}
它将按预期工作。