当前位置: 首页 > 编程语言 > C#

FakeItEasy为什么不能在变量中捕获期望值?分享

时间:2023-04-10 16:59:49 C#

为什么我不能在变量中捕获FakeItEasy期望值?我正在使用FakeItEasy来伪造一些实体框架调用,以确保正确映射一堆奇怪的遗留数据库表。我需要断言,正在将具有匹配特定DeliveryAddress的发票的客户添加到数据库中。如果我这样做:A.CallTo(()=>db.Customers.Add(A.That.Matches(c=>c.Invoices.First().Address==EXPECTED_ADDRESS))).MustHaveHappened();代码完美无缺。我想通过将期望转移到其他地方来简化语法,但是当我这样做时:varexpected=A.That.Matches(c=>c.Invoices.First().Address==EXPECTED_ADDRESS));A.CallTo(()=>db.Customers.Add(expected)).MustHaveHappened();测试失败。FakeItEasy代码中发生了什么,这意味着expect表达式在内联时有效,但不能在变量中捕获并在以后重用?答案在AlwaysplaceIgnored和A.CallTo内部的文档中:TheIgnored(and_)andThatmatchersmustbeplacedintheexpressioninsidetheA.CallTocall.这是因为这些特殊的约束方法不返回实际的匹配器对象。它们通过触发特殊事件告诉FakeItEasy如何匹配参数,然后调用约束方法。FakeItEasy仅在A.CallTo上下文中侦听A.CallTo。但是,我对“测试失败”感到惊讶。您使用的是什么版本?从FIE2.0.0开始,使用That就像您应该抛出异常System.InvalidOperationException:A.Ignored、A._和A.That只能在调用规范的上下文中使用A.CallTo()Nota直接回答为什么期望表达式可以内联而不是变量(我正在研究它,将很快编辑答案!)但是,我不喜欢.That.Matches。如果有多于一个,匹配可能会有点笨拙。如果任何匹配失败,则MustHaveHappened调用将抛出异常。让我不知道故障发生在哪里。我更喜欢这样做:CustomeraddedCustomer;A.CallTo(()=>a.Add(A._)).Invokes(c=>addedCustomer=c.GetArgument(0));//对addedCustomer断言的个人断言。AreEqual(EXPECTED_ADDRESS,addedCustomer.Invoices.First().Address);布莱尔的回答是正确的。我只是想建议一个解决方法:以上是C#学习教程:为什么我不能在变量中捕获FakeItEasy期望值?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注—//Localfunction,requiresC#7CustomerExpectedCustomer()=>A.That。匹配(c=>c.Invoices.First().Address==EXPECTED_ADDRESS));A.CallTo(()=>db.Customers.Add(ExpectedCustomer())).MustHaveHappened();本文收集自网络,不代表立场,如有侵权请点右联系管理员删除。如需转载请注明出处: