我有一个界面
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
。