Я собирался комментировать, но у меня недостаточно репутации, чтобы сделать это. Видимо, то, что вы спрашиваете, пока невозможно. Об этом есть проблема в Github.
WhenCalled () API позволяет Вам динамично разрешить возвращаемые значения.
Изменение тестового сценария к следующему позволит этому передавать:
numbers.Stub(x => x.GetEnumerator())
.Return(null)
.WhenCalled(x => x.ReturnValue =
new List<int> { 1, 2, 3 }.GetEnumerator()
);
Таким образом вместо того, чтобы возвратить тот же перечислитель, заблокированное поведение будет всегда возвращать новый перечислитель.
Оператор
numbers.Stub(x => x.GetEnumerator()).Return(new List<int> { 1, 2, 3 }.GetEnumerator());
идентично
var enumerator = new List<int> { 1, 2, 3 }.GetEnumerator();
numbers.Stub(x => x.GetEnumerator()).Return(enumerator);
В Вашем тесте Вы говорите Насмешкам Носорога давать идентичное IEnumerator<int>
экземпляр enumerator
дважды. Это не то, что Вы предназначили. Единственный экземпляр IEnumerator<int>
хорошо только для одного перечисления, не двух перечислений (Reset()
не поддерживается, обычно). Вы предназначили Насмешки Носорога для приведения двух различных примеров IEnumerator<int>
, так, чтобы они могли быть суммированы отдельно, так же, как любой вызов любому другому GetEnumerator<int>()
функция сделала бы.
Отказ от ответственности: Я работаю в Typemock
Я не знаю, можно ли использовать Носорога, чтобы сделать это, но можно использовать Изолятор с API AAA, который имеет точно, что Вы ищете -
[Test]
public void Should_be_able_to_use_enumerator_more_than_once()
{
var numbers = Isolate.Fake.Instance<INumbers>();
Isolate.WhenCalled(() => numbers).WillReturnCollectionValuesOf(new List<int>{ 1, 2, 3 });
var sut = new ObjectThatUsesEnumerator();
var correctResult = sut.DoSomethingOverEnumerator2Times(numbers);
Assert.IsTrue(correctResult);
}
Поскольку больше информации видит Руководящие Наборы в Руководстве разработчика.