2017-02-15 2 views
0

Dans ma base de code de compagnie nous avons un tas de méthode d'extension pour l'objet IEnumerable.Est-ce que NUnit fournit une aide d'énumération multiple?

Certains de cette méthode énumèrent plusieurs fois le paramètre donné en entrée.

Bien sûr, nous ne voulons pas le donc je vais corriger ces méthodes.

Mais d'abord je voudrais écrire un test unitaire pour détecter l'énumération multiple.

Je viens à une mise en œuvre de IEnumerable qui fournissent des informations de comptage d'énumération:

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; } 
} 

Le look de test comme ceci:

[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)); 
    } 
} 

-t-NUnit fournir un mécanisme pour ce faire plus légère?

Répondre

1

Si vous ne recherchez que les appels de méthode GetEnumerator, vous pouvez utiliser n'importe quel cadre fictif pour créer de fausses énumérables. .

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

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

fakeEnumerable.Received(2).GetEnumerator(); 

Il existe également une autre façon d'énumérer deux fois la collection. Cela peut être fait en utilisant IEnumerator.Reset metod. Il peut donc être utile de vérifier les appels de méthode Reset.