用Rhino Mocks嘲笑收藏品

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等)对象.大!我们已成功通过使用类型化列表来模拟自定义集合,以实际存储一组模拟对象.

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

Ste*_*ger 8

问题是,当你调用时,枚举器只被实例化一次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)