2017-02-15 8 views
0

私の会社コードベースにはIEnumerableオブジェクトの拡張メソッドがあります。NUnitは複数の列挙ヘルパーを提供しますか?

このメソッドのいくつかは、入力時に与えられたパラメータを複数回列挙します。

もちろん、私はこれらのメソッドを修正するつもりはありません。

しかし、最初に、複数の列挙を検出するための単体テストを書きたいと思います。

私が列挙カウント情報を提供IEnumerableの実装に来る:

public class TestableEnumerable<T> : IEnumerable<T> 
{ 
    readonly T[] values; 

    public TestableEnumerable(T[] values) 
    { 
     this.values = values; 
    } 

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); 

    public IEnumerator<T> GetEnumerator() 
    { 
     EnumerationCount++; 
     foreach (var value in values) 
     { 
      yield return value; 
     } 
    } 

    public int EnumerationCount { get; private set; } 
} 

このようなテストを見て:

[TestFixture] 
public class EnumerableExtensionsTests 
{ 
    TestableEnumerable<int> sut; 

    [SetUp] 
    public void SetUp() 
    { 
     sut = new TestableEnumerable<int>(new[] { -10, 0, 10 }); 
    } 

    [Test] 
    public void Append_Enumerate_Once() 
    { 
     var result = sut.Append(1).ToArray(); 
     Assert.That(sut.EnumerationCount, Is.EqualTo(1)); 
    } 
} 

はNUnitのは、より軽く、これを達成するための任意のメカニズムを提供していますか?

答えて

1

GetEnumeratorメソッド呼び出し回数のみを検索する場合は、任意のモックフレームワークを使用して偽の列挙型を作成できます。 There is NUnit.Mock framework. But now it's no longer being developed and NUnit project uses NSubstitute

var fakeEnumerable = Substitute.For<IEnumerable<int>>(); 
fakeEnumerable.GetEnumerator().Returns(Substitute.For<IEnumerator<int>>()); 

fakeEnumerable.ToArray(); 
fakeEnumerable.ToArray(); 

fakeEnumerable.Received(2).GetEnumerator(); 

また、コレクションを2回列挙する別の方法もあります。それはIEnumerator.Resetのmetodを使って行うことができます。 Resetメソッド呼び出しもチェックする価値があります。

関連する問題