我有一个界面
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();
}
}
答案 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
。