C#学习教程:MustHaveHappened在同一对象上调用两次时失败publicFoo(IBarbar){_bar=bar;}publicvoidDoStuff(){vardto=newDTO();dto.Num=1;_bar.Test(dto);dto.Num=2;_bar.Test(dto);}}publicclassDTO{publicintNum{get;放;}}公共接口IBar{voidTest(DTOdto);并且此测试方法(尝试验证IBar.Test())被调用两次:一次Num=1,一次Num=2):publicvoidTestMethod1(){varbar=A.Fake();varfoo=newFoo(酒吧);foo.DoStuff();A.CallTo(()=>bar.Test(A.That.Matches(x=>x.Num==1))).MustHaveHappened();A.CallTo(()=>bar.Test(A.That.Matches(x=>x.Num==2))).MustHaveHappened();}第一个“MustHaveHappened”调用失败。我发现这是因为在对IBar.Test()的两次调用中使用了同一个DTO实例。如果我更改代码以使用两个不同的DTO调用IBar.Test(),它会按预期工作。我的问题是:这是FakeItEasy中的错误还是我做错了什么?这是正确的行为,而不是错误。FakeItEasy记录带有参数的调用,但它不存储调用期间参数的内部状态——它只存储参数本身的引用/值。最后,在验证阶段,DTO对象的当前状态是Num等于2的状态,这就是FakeItEasy要验证的状态。我不确定是否有针对这种情况的开箱即用支持,但您可以轻松实现这种方法(无需创建第二个DTO对象):如果它对您有用并且您需要了解更多有关C#的信息学习教程,希望大家多多关注——varbar=A.Fake();varfoo=newFoo(酒吧);varexpectedNumValues=new[]{1,2};varactualNumValues=newList();//每当调用IBar.Test时,将DTO.Num存储在列表中A.CallTo(()=>bar.Test(A.Ignored)).Invokes(fakeCall=>{vardto=(DTO)fakeCall.参数[0];actualNumValues.Add(dto.Num);});foo.DoStuff();//这验证两个集合在相同位置包含相同元素CollectionAssert.AreEqual(expectedNumValues,actualNumValues);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
