伪造一种通用方法FakeItEasy

时间:2013-02-07 18:35:14

标签: c# 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 个答案:

答案 0 :(得分: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);
    }