Apa cara idiomatis untuk memverifikasi ukuran koleksi di xUnit?

112

Saya memiliki tes suite tes yang berjalan seperti ini:

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

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

Tes ini berfungsi seperti yang saya harapkan, tetapi ketika saya menjalankannya xUnit mencetak peringatan:

peringatan xUnit2013: Jangan gunakan Assert.Equal () untuk memeriksa ukuran koleksi.

Namun, tidak ada alternatif yang disarankan dalam peringatan tersebut, dan pencarian Google membawa saya ke kode sumber di xUnit untuk pengujian yang memverifikasi peringatan ini dicetak.

Jika Assert.Equal()bukan cara yang tepat untuk memverifikasi panjang koleksi, apakah itu?


Untuk memperjelas: Saya menyadari bahwa saya bisa "menipu" xUnit agar tidak mengeluarkan peringatan ini dengan misalnya mengekstrak variabel atau menggunakan Assert.True(stuff.Count() == 1)sebagai gantinya. Yang terakhir hanya hacky, dan yang pertama terasa seperti jika xUnit misalnya mencoba menghindari beberapa iterasi IEnumerable<T>, maka ini adalah cara yang salah (karena saya akan mendapatkan petunjuk kompiler tentang itu secara terpisah jika itu adalah masalah), dan xUnit itu sendiri seharusnya tidak pernah mengevaluasi input lebih dari sekali (pada kenyataannya mungkin akan mendapatkan input yang sama terlepas dari ekstraksi variabel, karena cara kerja pemanggilan fungsi C #).

Jadi, saya tidak hanya tertarik untuk menghapus peringatan itu dari keluaran saya. Jawaban atas pertanyaan saya juga menjelaskan mengapa peringatan itu disertakan di perpustakaan sejak awal dan mengapa pendekatan apa pun yang harus saya gunakan lebih baik.

Tomas Aschan
sumber
jika Anda menyimpan stuffCollection.Count()dalam variabel terpisah dan meneruskannya ke pernyataan apakah itu memberi Anda kesalahan yang sama?
hellyale
Mungkin yang ini ?
Uwe Keim

Jawaban:

112

Xunit menawarkan perbaikan cepat untuk sebagian besar peringatannya, jadi Anda harus dapat melihat apa yang menurutnya "benar".

xunit

Dalam kasus Anda, itu ingin Anda gunakan Assert.Singlekarena Anda mengharapkan tepat satu item. Jika Anda menggunakan nomor arbitrer, seperti 412, maka tidak akan ada peringatan tentang penggunaan Count. Ini hanya akan menyarankan penggunaan Singlejika Anda mengharapkan satu item, atau Emptyjika Anda mengharapkan tidak ada item.

vcsjones.dll
sumber
6
Terima kasih, itu masuk akal. FWIW, saya melihat ini ketika membangun di VS Code, di mana tindakan cepat tidak muncul, jadi sebenarnya menyertakan saran perbaikan dalam pesan peringatan akan jauh lebih membantu.
Tomas Aschan
2
@TomasLycken - ah. Ya, ada masalah untuk itu di sini: github.com/xunit/xunit/issues/1423
vcsjones
5
Saya bukan penggemar perilaku itu; terkadang 1 hitungan hanya insidental, dan tampaknya kurang ekspresif untuk menegakkan panggilan ke .Single (). Tes dapat berubah untuk mengharapkan hitungan yang berbeda, dan tampaknya menjengkelkan harus melakukan perubahan untuk memanggil metode yang sama sekali berbeda daripada hanya mengubah nomor.
vargonian
2
Single keren untuk item tunggal, saya punya 3 item, dan saya tidak ingin menulis Assert.Collection penuh, apakah xUnit memiliki Assert.Triple? haha
Pawel Cioch
1
@PawelCioch menurut xunit.net/xunit.analyzers/rules/xUnit2013.html yang mereka miliki Empty, Singledan NotEmpty- jika Anda mengharapkan nilai dinamis xUnit2013 tidak boleh memicu.
mbx
2

Saya menemukan ini memberi saya kesalahan yang sama:

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

Dan mentransmisikannya menghentikan kemunculan kesalahan.

Assert.Equal(2, (int)vm.Errors.Count());
devjc
sumber
2
Saya yakin, ini bukan yang ideomatic cara.
mbx
1

Untuk elemen tunggal dalam daftar, sebaiknya gunakan ini sebagai gantinya: Assert.Single(resultList);

Bosco Han
sumber
-1

Saya memiliki masalah yang sama ketika saya menggunakan properti Hitung seperti di bawah ini di xUnit.

masukkan deskripsi gambar di sini

Setelah, saya menggunakan fungsi Count () pada pengumpulan, itu memperbaiki masalah saya.

Bhuwan Maharjan
sumber
Memperbaiki masalah, tetapi Anda masih tidak menggunakan XUnit seperti seharusnya!
Daniel Eisenreich
8
@DanielEisenreich apa cara yang benar untuk menyatakan hitungan untuk nomor tertentu jika lebih besar dari 1?
SomeGuyOnAComputer
@SomeGuyOnAComputer dan 4 suara positif lainnya. Lupakan apa yang saya katakan, saya terlalu nakal. Jika lebih besar, Anda tidak punya pilihan lain.
Daniel Eisenreich