2017-02-15 63 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(); 

另外還有另一種枚舉集合兩次的方法。它可以通過使用IEnumerator.Reset metod完成。 因此,也可能需要檢查Reset方法調用。