5

次のように偽装するにはどうすればよいでしょうか。

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

私が望むのは、偽物が何も変更せずに引数を返すことです。ただし、偽物が 1 回だけ呼び出されたことを確認したいと思います。使用例を以下に示します。

  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);
     }
  }

つまり、偽物はパススルーとして機能する必要がありますが、それが使用されたことを確認できる必要もあります。

これについて最善の方法は何ですか?

[不自然な例について心配しないでください...裏では多くのことが行われていますが、上の例に簡略化しました。]

4

1 に答える 1

2

これで問題は解決しますか? 述語を通過し、ApplyFilter が 1 回だけ呼び出されたことも確認します。

    [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);
    }
于 2013-02-08T20:58:53.993 に答える