我最近在嘲讽中遇到的灾难并不值得一提,我需要实际推送IEnumerable<T>
模拟对象中的结果。你如何正确地模拟IEnumerable <T>?
下面是一个示例(示范只有IEnumerable<T>
,实际上并不好基于交互的测试!):
using System;
using System.Collections.Generic;
using Rhino.Mocks;
using MbUnit.Framework;
[TestFixture]
public class ZooTest
{
[Test]
public void ZooCagesAnimals()
{
MockRepository mockery = new MockRepository();
IZoo zoo = new Zoo();
// This is the part that feels wrong to create.
IList<IAnimal> mockResults = mockery.DynamicMock<IList<IAnimal>>();
IAnimal mockLion = mockery.DynamicMock<IAnimal>();
IAnimal mockRhino = mockery.DynamicMock<IAnimal>();
using (mockery.Record())
{
Expect.Call(zoo.Animals)
.Return(mockResults)
.Repeat.Once();
}
using (mockery.Playback())
{
zoo.CageThe(mockLion);
zoo.CageThe(mockRhino);
Assert.AreEqual(mockResults, new List<IAnimal>(zoo.Animals));
}
}
}
public class Zoo : IZoo
{
private IList<IAnimal> animals = new List<IAnimal>();
public void CageThe(IAnimal animal)
{
animals.Add(animal);
}
public IEnumerable<IAnimal> Animals
{
get
{
foreach(IAnimal animal in animals)
{
yield return animal;
}
}
}
}
public interface IAnimal
{
}
public interface IZoo
{
IEnumerable<IAnimal> Animals { get;}
void CageThe(IAnimal animal);
}
我不喜欢我怎么得到它,原因如下工作:
- 消费
IEnumerable<IAnimal>
结果到IList<IAnimal>
- 因为我知道这将结果检查到堆。 - 设置结果的内容 - 我也了解;但我的主要观点是测试
Zoo.Animals
是返回IEnumerable<IAnimal>
,甚至更好,它是使用yield return
里面。
有关这样做更好或更简单的建议吗?
编辑:我试图确定测试IEnumerable<T>
和我正在使用的任何之间的交互的最佳方式。我并非试图测试Zoo
可以容纳动物,而是Zoo
公开为IEnumerable<IAnimal>
,并且也被使用。
回想起来,这是一个** TERRIBLE **问题。试图让选票关闭 – 2009-10-31 05:24:54