Mon dernier désastre trébucher à travers la moquerie n'est pas que je dois pousser les résultats dans un objet simulé de IEnumerable<T>
.Comment vous moquez-vous correctement d'un IEnumerable <T>?
est ici un échantillon (démonstration seulement IEnumerable<T>
, pas vraiment bon test basé sur une interaction!):
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);
}
Je n'aime pas comment je l'ai eu à travailler pour les raisons suivantes:
- Consommer les résultats
IEnumerable<IAnimal>
enIList<IAnimal>
- parce que je comprends cela met les résultats à vérifier sur le tas. - Définition du contenu des résultats - que je comprends également; mais mon point principal est de tester que
Zoo.Animals
retourneIEnumerable<IAnimal>
, et encore mieux, qu'il utiliseyield return
à l'intérieur.
Des suggestions pour ce faire mieux ou plus simple?
Editer: J'essaie de déterminer la façon optimale de tester l'interaction entre IEnumerable<T>
et tout ce que j'utilise. Je n'essaie pas de tester que Zoo
peut contenir des animaux, plutôt que Zoo
expose comme IEnumerable<IAnimal>
, et que yield return
s'habitue également.
Rétrospectivement, il s'agit d'une question ** TERRIBLE **. Essayer d'obtenir des votes pour fermer –