次のテストケースは、サイのモックで失敗します。
[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> { }
このテストケースには非常に微妙な点があると思います。RhinoMocksのスタブが実際にどのように機能するかを考えていないのは私からだと思います。通常、IEnumerableを列挙するときは、新しいIEnumeratorから始めます。上記の例では、2回目にsumを呼び出すときに同じ列挙子を再利用できるように見えます。列挙子がすでにシーケンスの最後にある場合は、Sum()への2回目の呼び出しが返される理由を説明します。 0.この場合、GetEnumerator()を希望どおりに動作するようにモックアウトするにはどうすればよいですか(たとえば、新しい列挙子または同じ列挙子が位置0にリセットされます)。
2番目の.Sum()呼び出しが実際に0ではなく6を返すように、上記のテストケースをどのように変更しますか?