Was ist die idiomatische Methode, um die Sammlungsgröße in xUnit zu überprüfen?

111

Ich habe in meiner Testsuite einen Test, der ungefähr so ​​aussieht:

[Fact]
public void VerifySomeStuff()
{
    var stuffCollection = GetSomeStuff();

    Assert.Equal(1, stuffCollection.Count());
}

Dieser Test funktioniert wie erwartet, aber wenn ich ihn ausführe, gibt xUnit eine Warnung aus:

Warnung xUnit2013: Verwenden Sie Assert.Equal () nicht, um die Sammlungsgröße zu überprüfen.

In der Warnung wird jedoch keine Alternative vorgeschlagen, und eine Google-Suche führt mich zum Quellcode in xUnit, um zu testen, ob diese Warnung gedruckt wurde.

Wenn dies Assert.Equal()nicht der richtige Weg ist, um die Länge einer Sammlung zu überprüfen, was ist das?


Zur Verdeutlichung: Mir ist klar, dass ich xUnit dazu bringen könnte, diese Warnung nicht auszugeben, indem ich z. B. eine Variable extrahiere oder Assert.True(stuff.Count() == 1)stattdessen verwende. Letzteres ist nur hackig, und Ersteres scheint, wenn xUnit beispielsweise versucht, mehrere Iterationen von a zu vermeiden IEnumerable<T>, dann ist dies der falsche Weg (da ich Compiler-Hinweise dazu separat bekomme, wenn es sich um ein Problem handelt) und xUnit selbst sollte die Eingabe niemals mehr als einmal auswerten müssen (tatsächlich wird sie wahrscheinlich unabhängig von der Variablenextraktion dieselbe Eingabe erhalten, da der Aufruf von C # -Funktionen funktioniert).

Ich bin also nicht nur daran interessiert, diese Warnung aus meiner Ausgabe zu entfernen. Eine Antwort auf meine Frage erklärt auch, warum diese Warnung überhaupt in der Bibliothek enthalten ist und warum jeder Ansatz, den ich stattdessen verwenden sollte, besser ist.

Tomas Aschan
quelle
Wenn Sie stuffCollection.Count()in einer separaten Variablen speichern und diese an den Assert übergeben, erhalten Sie denselben Fehler?
Hellyale
Vielleicht dieser ?
Uwe Keim

Antworten:

112

Xunit bietet schnelle Korrekturen für die meisten seiner Warnungen, sodass Sie sehen können, was es für "richtig" hält.

xunit

In Ihrem Fall möchten Sie, dass Sie verwenden, Assert.Singleda Sie genau einen Artikel erwarten. Wenn Sie eine beliebige Zahl wie 412 angeben, erhalten Sie keine Warnung zur Verwendung Count. Es wird nur empfohlen, zu verwenden, Singlewenn Sie einen Artikel erwarten oder Emptywenn Sie keine Artikel erwarten.

vcsjones
quelle
6
Danke, das macht Sinn. FWIW, ich habe dies beim Erstellen von VS-Code gesehen, bei dem die schnelle Aktion nicht angezeigt wurde. Daher wäre es viel hilfreicher gewesen, den Korrekturvorschlag in die Warnmeldung aufzunehmen.
Tomas Aschan
2
@TomasLycken - ah. Ja, dafür gibt es hier ein Problem: github.com/xunit/xunit/issues/1423
vcsjones
5
Ich bin kein Fan dieses Verhaltens; Manchmal ist die 1-Zählung nur zufällig und es scheint weniger aussagekräftig, den Aufruf von .Single () zu erzwingen. Der Test kann sich ändern, um eine andere Anzahl zu erwarten, und es scheint ärgerlich, die Änderung vornehmen zu müssen, um eine völlig andere Methode aufzurufen, anstatt nur eine Nummer zu ändern.
Vargonian
2
Single ist cool für Single Item, ich habe 3 Items und ich möchte nicht die vollständige Assert.Collection schreiben. Hat xUnit Assert.Triple? haha
Pawel Cioch
1
@PawelCioch nach xunit.net/xunit.analyzers/rules/xUnit2013.html sie haben Empty, Singleund NotEmpty- wenn Sie einen dynamischen Wert xUnit2013 sollte nicht Trigger erwarten.
mbx
2

Ich fand dies geben mir den gleichen Fehler:

Assert.Equal(2, vm.Errors.Count());

Durch das Casting wurde der Fehler nicht mehr angezeigt.

Assert.Equal(2, (int)vm.Errors.Count());
devjc
quelle
2
Ich bin mir ziemlich sicher, dass dies nicht der ideomatische Weg ist.
mbx
-1

Ich hatte das gleiche Problem, als ich die Count-Eigenschaft wie unten in xUnit verwendet habe.

Geben Sie hier die Bildbeschreibung ein

Nachdem ich die Count () - Funktion für die Sammlung verwendet habe, wurde mein Problem behoben.

Bhuwan Maharjan
quelle
Das Problem wurde behoben, aber Sie verwenden XUnit immer noch nicht so, wie Sie es sollten!
Daniel Eisenreich
8
@DanielEisenreich Was ist der richtige Weg, um die Anzahl für eine bestimmte Zahl zu bestätigen, wenn sie größer als 1 ist?
SomeGuyOnAComputer
@SomeGuyOnAComputer und die anderen 4 Upvotes. Vergiss was ich gesagt habe, ich war zu frech. Wenn es größer ist, haben Sie keine andere Wahl.
Daniel Eisenreich