Qual è il modo idiomatico per verificare la dimensione della raccolta in xUnit?


112

Ho nella mia suite di test un test che va più o meno così:

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

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

Questo test funziona come previsto, ma quando lo eseguo xUnit stampa un avviso:

avviso xUnit2013: non utilizzare Assert.Equal () per verificare la dimensione della raccolta.

Tuttavia, nell'avviso non viene suggerita alcuna alternativa e una ricerca su Google mi porta al codice sorgente in xUnit per il test che verifica che questo avviso sia stampato.

Se Assert.Equal()non è il modo corretto per verificare la lunghezza di una raccolta, qual è?


Per chiarire: mi rendo conto che potrei "indurre" xUnit a non emettere questo avviso, ad esempio estraendo una variabile o usando Assert.True(stuff.Count() == 1)invece. Quest'ultimo è solo hacky, e il primo sembra che se xUnit stesse ad esempio cercando di evitare più iterazioni di un IEnumerable<T>, allora questo è il modo sbagliato di andare (perché riceverò suggerimenti per il compilatore separatamente se si tratta di un problema) e xUnit stesso non dovrebbe mai dover valutare l'input più di una volta (infatti probabilmente otterrà lo stesso input indipendentemente dall'estrazione delle variabili, a causa di come funziona la chiamata di funzione C #).

Quindi, non sono solo interessato a rimuovere quell'avvertimento dal mio output. Una risposta alla mia domanda spiega anche perché quell'avvertimento è incluso nella libreria in primo luogo e perché qualunque approccio dovrei usare invece è migliore.


se la memorizzi stuffCollection.Count()in una variabile separata e la passi all'assert ti dà lo stesso errore?
hellyale

Forse questo ?
Uwe Keim

Risposte:


112

Xunit offre soluzioni rapide per la maggior parte dei suoi avvisi, quindi dovresti essere in grado di vedere cosa pensa sia "giusto".

xUnit

Nel tuo caso, vuole che tu lo usi Assert.Singlepoiché ti aspetti esattamente un oggetto. Se stavi affermando un numero arbitrario, come 412, non ti darebbe un avvertimento sull'uso Count. SingleTi suggerirà di usarlo solo se ti aspetti un articolo o Emptyse non ti aspetti alcun articolo.


6
Grazie, ha senso. FWIW, l'ho visto durante la creazione in VS Code, dove l'azione rapida non veniva visualizzata, quindi in realtà includere il suggerimento di correzione nel messaggio di avviso sarebbe stato molto più utile.
Tomas Aschan

2
@TomasLycken - ah. Sì, c'è un problema qui: github.com/xunit/xunit/issues/1423
vcsjones

5
Non sono un fan di quel comportamento; a volte il conteggio 1 è solo accidentale e sembra meno espressivo imporre la chiamata a .Single (). Il test può cambiare per aspettarsi un conteggio diverso, e sembra fastidioso dover apportare la modifica per chiamare un metodo completamente diverso piuttosto che cambiare solo un numero.
vargoniana

2
Single va bene per un singolo articolo, ho 3 articoli e non voglio scrivere Assert.Collection completo, xUnit ha Assert.Triple? haha
Pawel Cioch

1
@PawelCioch secondo il xunit.net/xunit.analyzers/rules/xUnit2013.html hanno Empty, Singlee NotEmpty- se vi aspettate un valore dinamico xUnit2013 non dovrebbe grilletto.
mbx

2

Ho scoperto che questo mi dava lo stesso errore:

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

E il casting ha impedito la visualizzazione dell'errore.

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

2
Sono abbastanza sicuro, questo non è il modo ideomatico .
mbx

1

Per un singolo elemento in un elenco, è meglio usare questo invece: Assert.Single(resultList);


-1

Ho avuto lo stesso problema quando ho usato la proprietà Count come sotto in xUnit.

inserisci qui la descrizione dell'immagine

Dopo, uso la funzione Count () sulla raccolta, ha risolto il mio problema.


Risolto il problema, ma non usi ancora XUnit come dovresti!
Daniel Eisenreich

8
@DanielEisenreich qual è il modo corretto per affermare il conteggio per un numero specifico se è maggiore di 1?
SomeGuyOnAComputer

@SomeGuyOnAComputer e gli altri 4 voti positivi. Dimentica quello che ho detto, ero troppo sfacciato. Se è più grande non hai altra scelta.
Daniel Eisenreich
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.