Thảm họa mới nhất của tôi vấp ngã thông qua chế nhạo không phải là grokking mà tôi cần phải thực sự đẩy kết quả bên trong một đối tượng giả của IEnumerable<T>
.Làm thế nào để bạn giả lập một số IE2umerIEnumerable?
Dưới đây là một ví dụ (trình diễn duy nhất của IEnumerable<T>
, không thực sự tốt thử nghiệm tương tác dựa trên!):
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);
}
tôi không thích làm thế nào tôi đã nhận nó để làm việc vì những lý do sau đây:
- Tiêu thụ các kết quả
IEnumerable<IAnimal>
thànhIList<IAnimal>
- bởi vì tôi hiểu điều này đặt kết quả để kiểm tra vùng heap. - Thiết lập nội dung của kết quả - mà tôi cũng hiểu; nhưng điểm chính của tôi là kiểm tra rằng
Zoo.Animals
đang trả lạiIEnumerable<IAnimal>
và thậm chí tốt hơn, rằng nó đang sử dụngyield return
bên trong.
Bất kỳ đề xuất nào để làm điều này tốt hơn hoặc đơn giản hơn?
Chỉnh sửa: Tôi đang cố gắng xác định cách tối ưu để kiểm tra tương tác giữa IEnumerable<T>
và bất kỳ điều gì tôi đang sử dụng. Tôi không cố gắng kiểm tra rằng Zoo
có thể giữ động vật, thay vì đó Zoo
cho thấy là IEnumerable<IAnimal>
và rằng yield return
cũng đang được sử dụng.
Nhìn lại, đây là câu hỏi ** TERRIBLE **. Đang cố gắng để có được phiếu để Đóng –