我有一个界面

public interface IInterface { void DoSomething(); }


另一个界面

public interface IOtherInterface : IInterface { }


抽象类

public abstract class AbstractClass : IInterface
{
    public void DoSomething()
    {
        Console.WriteLine("Got here");
    }
}


我正在编写单元测试和伪造的IOtherInterface。抽象类已经包含了一些我想在单元测试中利用的有用方法。如何使我的A.Fake<IOtherInterface>();AbstractClass继承?

到目前为止,这是我尝试过的方法,但是它不起作用-AbstractClass.DoSomething不会受到攻击。

        IOtherInterface fake = A.Fake<IOtherInterface>(builder => builder.Implements(typeof (AbstractClass)));

        fake.DoSomething();


当然,如果我像这样进行代理:

        var abstractFake = A.Fake<AbstractClass>();
        A.CallTo(() => fake.DoSomething()).Invokes(abstractFake.DoSomething);

        fake.DoSomething();


……事情如我所愿。是否有内置的机制可以实现此目的,所以我不需要该代理abstractFake对象?

更新

我需要IOtherInterface,因为我有一个需要将该IOtherInterface作为依赖项的客户端类:

class Consumer
{
    public Consumer(IOtherInterface otherInterface)
    {
        otherInterface.DoSomething();
    }
}

最佳答案

var fake = (IOtherInterface) A.Fake<AbstractClass>(builder =>
                               builder.Implements(typeof(IOtherInterface)));
A.CallTo(() => fake.DoSomething()).CallsBaseMethod();
fake.DoSomething();


Implements仅用于接口,因此使用它的正确方法是伪造接口或类,并使用Implements添加其他接口。我认为它应该向您抱怨,所以我提出了complain when IFakeOptionsBuilder.Implements is passed a non-interface,该问题已在FakeItEasy 2.0.0中修复。

CallsBaseMethod将确保执行Abstract类的方法。

我会推荐builder.CallsBaseMethods(),但这无法重定向呼叫。我认为这是因为它正在重定向AbstractClass.DoSomething,但是当我们将伪造的内容投射到IOtherInterface并调用DoSomething时,它是不匹配的。我已经提出了investigate interaction between Implements and CallsBaseMethods

09-13 05:06