MRA*_*RAH 2 .net c# rhino-mocks
所以这是我想许多人想做的事情,模拟一个集合.在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());
Run Code Online (Sandbox Code Playgroud)
所以,这是正常的,当你foreach col_mock你得到模拟(custom_mock1等)对象.大!我们已成功通过使用类型化列表来模拟自定义集合,以实际存储一组模拟对象.
问题是,你只能这样做一次!你只能预告这个系列一次.有谁知道(没有创建一个真正的自定义集合......)我如何实现可以多次迭代的自定义集合的模拟?
问题是,当你调用时,枚举器只被实例化一次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);
}
Run Code Online (Sandbox Code Playgroud)