C# 如何等待将特定linq表达式作为参数的调用
我有一个电话要查一查发生了什么事。此调用是对将Linq表达式作为参数的方法的调用。此表达式根据声明表达式的局部变量的id测试对象id。只有当Linq表达式相等(替换了中的局部变量)时,或者当Linq表达式中使用的局部变量等于某个值时,如果不可能触发,我如何才能对该触发器进行假轻松调用 我当前的代码如下所示C# 如何等待将特定linq表达式作为参数的调用,c#,linq,unit-testing,expression,fakeiteasy,C#,Linq,Unit Testing,Expression,Fakeiteasy,我有一个电话要查一查发生了什么事。此调用是对将Linq表达式作为参数的方法的调用。此表达式根据声明表达式的局部变量的id测试对象id。只有当Linq表达式相等(替换了中的局部变量)时,或者当Linq表达式中使用的局部变量等于某个值时,如果不可能触发,我如何才能对该触发器进行假轻松调用 我当前的代码如下所示 A.CallTo(() => SomeMethod.FindBy(item=> item.ItemId == 3)).MustHaveHappened(Repeated.Ex
A.CallTo(() => SomeMethod.FindBy(item=> item.ItemId == 3)).MustHaveHappened(Repeated.Exactly.Once);
作为对的调用,并在正在测试的代码中使用
SomeMethod.FindBy(item=> item.ItemId == id)
其中id是一个局部变量。这不起作用,因为在进行调用时,id没有被替换,并且我得到一个类似这样的错误
SomeInterface`1[[someItem, someItemFolder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].FindBy(item=> (item.ItemId == 3))
Expected to find it exactly once but found it #0 times among the calls:
1: SomeInterface`1[UKHO.WeeklyRecipes.EFModels.EFModels.EfTag].FindBy(predicate: tag => (tag.TagId == value(UKHO.WeeklyRecipes.BusinessLayer.PreferenceQueries+<>c__DisplayClass2_0).id))
SomeInterface`1[[someItem,someItemFolder,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]].FindBy(item=>(item.ItemId==3))
预计只会找到一次,但在呼叫中找到了0次:
1:SomeInterface`1[UKHO.WeeklyRecipes.EFModels.EFModels.EfTag].FindBy(谓词:tag=>(tag.TagId==value(UKHO.WeeklyRecipes.BusinessLayer.PreferenceQueries+c_uDisplayClass2_0.id))
您看到这种行为是因为Fakeitesy无法判断这两个表达式是否相同。当您提供一个对象作为参数约束时,FakeiTesy会尝试。在这种情况下,它意味着调用表达式的Equals
方法。要引用文档,请执行以下操作:
当检查参数相等时,FakeiTesy使用object.Equals
。如果要检查的类型没有提供适当的Equals
方法,则可能必须使用中描述的this.Matches方法。对于那些Equals
方法执行引用相等而不是值相等的类型,要特别小心。在这种情况下,对象必须是相同的对象才能匹配,这有时会产生意外的结果。如果有疑问,请手动验证类型的等于行为
因此,本质上这意味着,如果您创建了两个变量,一个包含表达式item=>item.ItemId==3
,另一个item.ItemId==id
,并使用Equals
对它们进行比较,您将看到false
结果,Fakeitesy也是如此
一种方法是捕获表达式,然后询问它,看看它是否按照您的喜好行事(也就是说,接受3,拒绝非3)。这很尴尬,但比较谓词很难。我在回答你的问题时更多地谈到了这一点