【问题标题】:Faking a generic method FakeItEasy伪造一个泛型方法 FakeItEasy
【发布时间】:2013-02-07 18:35:13
【问题描述】:

您将如何伪造以下内容:

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

即假货需要充当通过,但我还需要能够验证它是否已被使用。

最好的方法是什么?

[请不要担心这个人为的例子......幕后发生了很多事情,但我已经将其简化为上面的例子。]

【问题讨论】:

  • 您要验证它是使用不超过一次、至少使用一次还是仅使用一次?如果不满足这个条件应该怎么办?该接口是否应该具有numInvocations 属性?您可以很容易地验证它不会被更多调用一次,但要知道它是否未被调用……您需要一种方法来提供反馈。
  • 不涉及泛型,我可以用 var fake = A.Fake(); A.CallTo(()==> fake.SomeMethod(A._)) .ReturnsLazily(x=>x.GetArgument(0)); .... A.CallTo(fake).MustHaveHappened(Repeated.Exactly.Once);我不知道如何使用 Func 泛型在那里做同样的事情。我已经尝试创建接口的 Dummy 实现,并且可以通过,但由于这是具体的,FakeItEasy 无法验证它是否被使用。
  • 因此,鉴于您需要确保它恰好发生在您希望该方法返回一个具有两个属性的类时,NumInvokations 和这个函数。将函数传递到其他地方,然后确定 NumInvokations 是否等于 1。
  • 所以你的意思是一个虚拟实现是:class Dummy : IBlah { public int Invocations; public Func ApplyFilter(Func handler) { Invocations++;返回处理程序; } } 问题是这个特殊的东西将嵌套在另一个假货中。我希望 FakeItEasy 能够在无需手工制作的情况下进行模拟。

标签: c# fakeiteasy


【解决方案1】:

这能解决您的问题吗?它将通过谓词并验证 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);
    }

【讨论】:

  • 虽然在将 T 指定为 int 时会起作用,但我正在寻找适用于任何类型的通用版本。以下类型显示了我想要实现的目标:pastebin.com/fJgi6ikj 换句话说,假的应该适用于 any IMessage,而无需指定确切的类型。
猜你喜欢
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多