gpt4 book ai didi

c# - 使用 Rhino Mocks 模拟集合

转载 作者:行者123 更新时间:2023-11-30 19:07:40 27 4
gpt4 key购买 nike

所以我想这是很多人想做的事情,模拟一个集合。在过去使用 Rhino 时,我使用类似的方法来完成此操作:

var col_mock = MockRepository.GenerateMock<ICustomCollection>(); // returns ICustom let's say
List<ICustom> col_real = new List<ICustom>();
col_real.Add(custom_mock1);
col_real.Add(custom_mock2);
col_real.Add(custom_mock3);
col_mock.Stub(x => x.GetEnumerator()).Return(col_real.GetEnumerator());

所以是的,这很好用,当你 foreach col_mock 时,你会得到模拟的(custom_mock1 等)对象。伟大的!通过使用类型化列表实际存储大量模拟对象,我们成功地模拟了自定义集合。

问题是,你只能这样做一次!你只能 foreach 这个集合一次。有谁知道(没有创建实际的自定义集合...)我如何实现可以迭代多次的自定义集合的模拟?

最佳答案

问题是当您调用 Return 时,枚举器只被实例化一次。然后它返回第一个 foreach 之后已经位于列表末尾的同一个实例。

每次调用GetEnumerator 时都需要实例化一个新的枚举器。您可以使用 WhenCalled 来执行此操作。

Return 还是需要的,因为缺少Rhino Mocks会报错。但你传递什么作为参数并不重要。

[TestMethod]
public void GetEnumerator()
{
IList<int> col_mock = MockRepository.GenerateMock<IList<int>>();
List<int> col_real = new List<int>();
col_real.Add(1);
col_real.Add(2);
col_real.Add(3);
col_mock
.Stub(x => x.GetEnumerator())
// create new enumerator instance for each call
.WhenCalled(call => call.ReturnValue = col_real.GetEnumerator())
.Return(null) // is ignored, but needed for Rhinos validation
.Repeat.Any();

foreach (int i in col_mock)
{
}

int count = 0;
foreach (int i in col_mock)
{
count++;
}
Assert.AreSame(3, count);
}

关于c# - 使用 Rhino Mocks 模拟集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4041501/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com