FakeItEasy - 有一个接口伪继承自abstract,而两者共享相同的接口继承

时间:2015-02-24 14:07:40

标签: c# unit-testing mocking fakeiteasy

我有一个界面

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();
    }
}

1 个答案:

答案 0 :(得分:3)

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