C# 伪造通用方法伪造

C# 伪造通用方法伪造,c#,fakeiteasy,C#,Fakeiteasy,你会如何伪造以下内容: public interface IBlah { Func<T, bool> ApplyFilter<T>(Func<T, bool> predicate) where T:IMessage; } 公共接口IBlah { Func ApplyFilter(Func谓词),其中T:IMessage; } 我想要的是假的,只是返回它的论点没有任何变化。然而,我想核实一下,这个假货确实被打过一次电话。下面给出了一个用例: pu

你会如何伪造以下内容:

public interface IBlah
{
    Func<T, bool> ApplyFilter<T>(Func<T, bool> predicate) where T:IMessage;
}
公共接口IBlah
{
Func ApplyFilter(Func谓词),其中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);
     }
  }
公共类
{
公之于众
公共bool DoSomething(SomeValue m,Func谓词)
{
Func处理程序=blah.ApplyFilter(谓词);
返回处理器(m);
}
}
i、 e.假货需要作为一种通行证,但我还需要能够验证它是否被使用

最好的办法是什么


[请不要担心这个人为的例子…有很多事情在幕后进行,但我将其简化为上面的例子。]

这能解决您的问题吗?它将通过谓词并验证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);
    }
[事实]
公共void TestFeature()
{
var fake=A.fake();
A.CallTo(()=>false.ApplyFilter(A.Ignored)).returnslazilly(x=>
{
返回x.GetArgument(“谓词”);
});
var某物=新某物(假);
var result=something.DoSomething(1,x=>x>1);
Assert.False(结果);
A.CallTo(()=>false.ApplyFilter(A.Ignored))。必须已经发生(重复。精确。一次);
}

您想验证它是否只使用过一次、至少使用过一次或仅使用过一次?如果不符合该条件,该怎么办?该接口是否应该具有
numinactions
属性?你可以很容易地验证它不会被多次调用,但是如果知道它没有被调用,你需要一种方法来提供反馈;A.CallTo(()==>false.SomeMethod(A.))).returnslazilly(x=>x.GetArgument(0))。。。。A.CallTo(假的)。一定发生过(重复。准确地说。一次);我不知道如何在Func泛型存在的情况下做同样的事情。我尝试过创建一个接口的虚拟实现,它可以完成传递,但由于这是具体的,FakeiTesy无法验证它是否被使用。因此,考虑到您需要确保它只发生一次,您希望该方法返回一个具有两个属性的类,
NumInvokations
,以及此函数。将函数传递到其他位置,然后确定
NumInvokations
是否等于1。因此,您的意思是虚拟实现是:类虚拟:IBlah{public int Invocations;public Func ApplyFilter(Func handler){Invocations++;return handler;}问题是这个特殊的东西将嵌套在另一个伪代码中..我希望FakeiTesy能够在不需要手工制作的情况下进行模拟。虽然在将T指定为int时这会起作用,但我正在寻找一个适用于任何类型的通用版本。下面显示了我试图实现的目标:换句话说,假消息应该适用于任何IMessage,而不必指定确切的类型。