2015-02-24 35 views
3

我有一个接口FakeItEasy - 具有界面假从抽象继承虽然二者有相同的接口继承

public interface IInterface { void DoSomething(); } 

另一个接口

public interface IOtherInterface : IInterface { } 

一个抽象类

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

我m写单元测试并假冒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对象?

UPDATE

我需要IOtherInterface,因为我需要的是IOtherInterface作为依赖客户端类:

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

它的确如此,但'abstractFake'变量的类型是'AbstractClass'而不是'IOtherInterface'。我需要'IOtherInterface'。查看更新:) – 2015-02-24 14:40:15

+0

感谢您提出这个问题。正如你从布莱尔康拉德的回答中看到的那样,结果提出了两个项目问题,这很好! – 2015-02-26 06:52:57

+0

@AdamRalph我会诚实地说,它让我大开眼界,去看看布莱尔的职业活动,去创造那些你通常看不到的项目问题。通常,即使项目的合作者也会说“提交错误”。无论如何,我很高兴我有间接的贡献:) – 2015-02-26 14:27:42

回答

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

+0

感谢@blairconrad帮忙,主动提出投诉/调查。我不知道FakeItEasy的发布周期,但我期待着解决这些问题。 :) – 2015-02-24 15:41:25

+2

@JoaoMilasch,FakeItEasy通常会[经常发布](https://www.nuget.org/packages/FakeItEasy),但是与许多开源项目一样,日程表取决于核心团队的可用性和贡献率来自社区。 由于核心团队参与了即将发布的2.0版本,因此我不一定期待_speedy_解决方案,这些问题相当小。一个是“添加一条警告消息,让用户知道他们使用了错误的实现”,另一个是相当一个角落的情况 - 两个非小功能之间的交互,它有一个解决方法。 – 2015-02-25 11:33:03

+0

够公平的。无论如何,我还是喜欢周围的工作。感谢您的帮助。 – 2015-02-25 13:59:14