मेरा नवीनतम आपदा मॉकिंग के माध्यम से ठोकर खा रहा है कि मुझे वास्तव में 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>
के रूप में खुलासा करता है, और yield return
भी इसका उपयोग किया जा रहा है।
पीछे की ओर, यह एक ** ट्रिब्रिबल ** प्रश्न है। वोट बंद करने की कोशिश कर रहा है –