2013-02-07 29 views
5

,你会如何去伪造了以下内容:伪造泛型方法FakeItEasy

public interface IBlah 
{ 
    Func<T, bool> ApplyFilter<T>(Func<T, bool> predicate) where T:IMessage; 
} 

我想是假简单地返回它没有任何变化的说法。但是,我想验证一下这个假货已经被叫了一次。一个用例如下:

public class Something 
    { 

    public Something(IBlah blah) { _blah = blah; } 

    public bool DoSomething(SomeValue m, Func<SomeValue, bool> predicate) 
    { 
     Func<SomeValue, bool> handler = _blah.ApplyFilter(predicate); 
     return handler(m); 
    } 
    } 

即假冒需要充当通过,但我也需要能够验证它已被使用。

这是什么最好的方法呢?

[请不要担心人为的例子......有很多事情在幕后事,但我上面简化下来的例子。]

+1

是否要验证它的使用不超过一次,至少使用过一次,还是只使用一次?如果它不符合这个条件会发生什么?该接口是否应该具有'numInvocations'属性?您可以验证它不会被称为* more *,而不是一次调用它,但知道它是否未被调用...您需要提供反馈的方式。 – Servy

+0

没有涉及泛型,我可以用 var fake = A.Fake (); (()==> fake.SomeMethod(A ._)) .ReturnsLazily(x => x.GetArgument (0)); .... A.CallTo(fake).MustHaveHappened(Repeated.Exactly.Once); 我不知道如何做相同的Func 通用在那里。我尝试过创建接口的Dummy实现,并且可以完成传递,但由于具体,FakeItEasy无法验证它是否被使用。 – ashic

+0

所以,假设你需要确保一旦你想要方法返回一个具有两个属性'NumInvokations'和这个函数的类,就确实发生了。在其他地方传递函数,然后确定'NumInvokations'是否等于1。 – Servy

回答

2

这会解决您的问题?它将通过谓词并验证ApplyFilter只被调用一次

[Fact] 
    public void TestFeature() 
    { 
     var fake = A.Fake<IBlah>(); 
     A.CallTo(() => fake.ApplyFilter(A<Func<int, bool>>.Ignored)).ReturnsLazily(x => 
      { 
       return x.GetArgument<Func<int, bool>>("predicate"); 
      }); 
     var something = new Something(fake); 
     var result = something.DoSomething(1, x => x > 1); 

     Assert.False(result); 
     A.CallTo(() => fake.ApplyFilter(A<Func<int, bool>>.Ignored)).MustHaveHappened(Repeated.Exactly.Once); 
    } 
+0

虽然这将工作,同时指定T为int,我正在寻找一个适用于任何类型的通用版本。以下种类显示了我试图实现的功能: http://pastebin.com/fJgi6ikj 换句话说,假冒应该为任何* IMessage工作,而不必指定确切的类型。 – ashic