Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何等待将特定linq表达式作为参数的调用_C#_Linq_Unit Testing_Expression_Fakeiteasy - Fatal编程技术网

C# 如何等待将特定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

我有一个电话要查一查发生了什么事。此调用是对将Linq表达式作为参数的方法的调用。此表达式根据声明表达式的局部变量的id测试对象id。只有当Linq表达式相等(替换了中的局部变量)时,或者当Linq表达式中使用的局部变量等于某个值时,如果不可能触发,我如何才能对该触发器进行假轻松调用

我当前的代码如下所示

   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)。这很尴尬,但比较谓词很难。我在回答你的问题时更多地谈到了这一点