是否可以将Moq(或任何其他模拟api)赋予默认实现?

时间:2012-11-01 13:45:50

标签: .net moq

这是情景:

interface IFather
{
    void A();
}

interface ISonA : IFather
{
    void B();
}

我有一个IFather的默认实现

private class Father : IFather
{
    public void A()
    {
        //default behaviour
    }
}

是否可以使用Father提供的默认行为来模拟ISonA(或任何其他实现IFather的ISon)?我想做这样的事情:

    var mock = new Mock<ISonA>(typeof(Father));
    //with A nothing, use default behaviour
    //mock.Setup(x => x.A()).Callback(() =>  /*something*/);
    mock.Setup(x => x.B()).Callback(() =>  /*something*/);

typeof(父亲)是告诉Mock在内部实施ISonA扩展父亲的方法。目前实现这一目标的唯一方法是使用我自己的SonA类而不是模拟它

2 个答案:

答案 0 :(得分:0)

我找到了解决方案!模拟应该像这样创建:

var mock = new Mock<Father>().As<ISonA>();

通过这种方式,我继承了父的实现并同时获得了一个ISonA模拟

答案 1 :(得分:0)

最后我得到了解决方案。上一个示例需要一些修复。最后显示完整的代码。 1º方法A()必须在父类中标记为虚拟。 必须使用属性CallBase = true

配置2ºmock
public interface IFather
{
    int A();
}

public interface ISon : IFather
{
    int B();
}

public class Father : IFather
{
    public virtual int A()
    {
        return 1;
    }
}

测试代码

var mock = new Mock<Father>().As<ISon>();
mock.CallBase = true;