如何模拟扩展类并实现接口的对象?

时间:2011-12-20 09:55:44

标签: c# unit-testing mocking nunit

我有这堂课:

public class BaseFoo
{
    public bool BoolProp { get; set; }
}

public interface IFoo {
    void Method();
}

public class FooClass : BaseFoo, IFoo
{
    public void Method()
    {
        // DoSomething
    }
}

public class MyClass
{
    IFoo foo; // 
    public MyClass(IFoo foo)
    {
        this.foo = foo;
    }

    public void DoSomething()
    {
        if (((FooClass)foo).BoolProp)
        {
            // yeah
        }
        else
        {
            //bad
        }
    }
}

我的情景是:

    void main()
    {
        MyClass obj = new MyClass(new FooClass());
        obj.DoSomething();
    } 

我想为IFoo接口创建一个模拟对象,允许我模拟BaseFoo类,因为我需要总是避免运行“if(((FooClass)foo).BoolProp的”else“分支。 )“在MyClass.DoSomething()方法中 那么,我怎样才能创建一个模拟对象,允许我模拟MyClass中使用的BaseFoo.BoolProp的行为(这将采用IFoo的模拟对象)?
我没有任何结果,因为“BoolProp”不是虚拟的,我无法更改它,因为它是.NET Framework类的一部分:

  var cMock = new Mock<BaseFoo>();
  var iMock = cMock.As<IFoo>();

  cMock.Setup(c => c.BaseProp).Returns(true);
  MyClass myClass = new MyClass(iMock.Object);

2 个答案:

答案 0 :(得分:5)

您的设计真正说的是您的班级MyClass没有依赖IFoo,它依赖于从BaseFoo 和<派生的类实例/ strong>实施IFoo。在这种情况下,最好引入一个统一的接口,然后将其用作依赖项并模拟:

interface IFooBar
{
  bool BoolProp { get; set; }
  void Method();
}  

答案 1 :(得分:0)

如何声明从BaseFoo派生并实现IFoo的抽象类(BaseFooFoo?)。然后你可以向moq显示BaseFooFoo。