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

MockingIEnumerable类型的GetEnumerator()方法分享

时间:2023-04-10 22:37:55 C#

MockingIEnumerable类型的GetEnumerator()方法以下测试用例在rhinomocks中失败:(){varnumbers=MockRepository.GenerateStub();numbers.Stub(x=>x.GetEnumerator()).Return(newList{1,2,3}.GetEnumerator());varsut=newObjectThatUsesEnumerator();varcorrectResult=sut.DoSomethingOverEnumerator2Times(数字);断言.IsTrue(correctResult);}}publicclassObjectThatUsesEnumerator{publicboolDoSomethingOverEnumerator2Times(INumbersnumbers){intsum1=numbers.Sum();//返回6intsum;sum2=(number)//返回0=[returnsum1+sum2==sum1*2;}}publicinterfaceINumbers:IEnumerable{}我认为这个测试用例有一些非常微妙的地方,我不认为我在考虑RhinoMocksstbing的实际效果。通常,当您枚举IEnumerable时,您会从一个新的IEnumerator开始。在上面的示例中,看起来我可以在第二次调用sum时重复使用相同的枚举器,如果枚举器已经在其序列的末尾,那么这就解释了为什么第二次调用Sum()会返回0.如果是这种情况,我如何模拟GetEnumerator()以使其按照我想要的方式运行(例如,新枚举器或相同枚举器重置为0)?您将如何修改上面的测试用例,以便第二个.Sum()调用实际返回6而不是0?WhenCalled()api允许您动态解析返回值。将测试用例更改为以下内容将允许它通过:numbers.Stub(x=>x.GetEnumerator()).Return(null).WhenCalled(x=>x.ReturnValue=newList{1,2,3}.GetEnumerator());因此,存根行为将始终返回一个新的枚举器,而不是返回相同的枚举器。语句numbers.Stub(x=>x.GetEnumerator()).Return(newList{1,2,3}.GetEnumerator());与varenumerator=newList{1,2,3}完全相同。获取枚举器();numbers.Stub(x=>x.GetEnumerator()).Return(枚举器);在您的测试中,您告诉RhinoMocks两次提供相同的IEnumerator实例枚举器。那不是你想要的。IEnumerator的单个实例仅适用于一个枚举,而不适用于两个(通常不支持Reset())。您希望RhinoMocks提供两个不同的IEnumerator实例,以便它们可以独立求和,就像对任何其他GetEnumerator()函数的任何调用一样。免责声明:我在Typemock上工作,我不知道你是否可以用Rhino做到这一点,但你可以使用Isolator和AAAAPI,它完全符合你的要求-[测试]publicvoidShould_be_able_to_use_enumerator_more_than_once(){varnumbers=Isolate.假的实例();Isolate.WhenCalled(()=>numbers).WillReturnCollectionValuesOf(newList{1,2,3});varsut=newObjectThatUsesEnumerator();varcorrectResult=sut.DoSomethingOverEnumerator2Times(numbers);断言。是真的(正确的结果);有关详细信息,请参阅开发人员指南中的管理集合。以上就是C#学习教程:模拟IEnumerable类型的GetEnumerator()方法分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: