Следующий тестовый пример терпит неудачу в насмешках на носорога:
[TestFixture]
public class EnumeratorTest
{
[Test]
public void Should_be_able_to_use_enumerator_more_than_once()
{
var numbers = MockRepository.GenerateStub<INumbers>();
numbers.Stub(x => x.GetEnumerator()).Return(new List<int>
{ 1, 2, 3 }.GetEnumerator());
var sut = new ObjectThatUsesEnumerator();
var correctResult = sut.DoSomethingOverEnumerator2Times
(numbers);
Assert.IsTrue(correctResult);
}
}
public class ObjectThatUsesEnumerator
{
public bool DoSomethingOverEnumerator2Times(INumbers numbers)
{
int sum1 = numbers.Sum(); // returns 6
int sum2 = numbers.Sum(); // returns 0 =[
return sum1 + sum2 == sum1 * 2;
}
}
public interface INumbers : IEnumerable<int> { }
Я думаю, что в этом тестовом примере есть что-то очень тонкое, и я
думаю, что это от меня не продумывая, как Rhino Mocks загрызть
на самом деле работает. Как правило, когда вы перечисляете по IEnumerable, вы
начинаем со свежего IEnumerator. В приведенном выше примере это выглядит
как я мог бы повторно использовать тот же счетчик во второй раз, когда я
вызывающая сумма, и если счетчик уже находится в конце
последовательность, которая объясняет, почему второй вызов Sum () возвращает 0.
Если это так, как я могу издеваться над GetEnumerator () в такой
способ, которым он ведет себя так, как я этого хочу (например, новый
перечислитель или тот же перечислитель сброшен в положение 0)?
Как бы вы изменили приведенный выше тестовый пример, чтобы второй вызов .Sum () фактически возвращал 6 вместо 0?