XUnit'te koleksiyon boyutunu doğrulamanın deyimsel yolu nedir?


112

Test süitimde şuna benzer bir test var:

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

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

Bu test beklediğim gibi çalışıyor, ancak çalıştırdığımda xUnit bir uyarı veriyor:

uyarı xUnit2013: Koleksiyon boyutunu kontrol etmek için Assert.Equal () kullanmayın.

Ancak uyarıda herhangi bir alternatif önerilmiyor ve bir google araması beni bu uyarının yazdırıldığını doğrulayan test için xUnit'teki kaynak koduna götürüyor.

Eğer Assert.Equal()bir koleksiyon uzunluğunu doğrulamak için doğru bir yol değildir, nedir?


Açıklığa kavuşturmak için: xUnit'i bu uyarıyı yaymaması için örneğin bir değişkeni çıkararak veya Assert.True(stuff.Count() == 1)onun yerine kullanarak kandırabileceğimi fark ettim . İkincisi sadece hilekar ve ilki, xUnit örneğin birden fazla yinelemeden kaçınmaya çalışıyormuş gibi hissediyor IEnumerable<T>, o zaman bu yanlış bir yoldur (çünkü bir sorunsa bununla ilgili derleyici ipuçlarını ayrıca alacağım) ve xUnit kendisi hiçbir zaman girdiyi birden fazla değerlendirmek zorunda kalmamalıdır (aslında, C # işlev çağrısının nasıl çalıştığından dolayı, değişken çıkarımdan bağımsız olarak muhtemelen aynı girdiyi alacaktır).

Yani, sadece bu uyarıyı çıktımdan kaldırmakla ilgilenmiyorum. Sorumun cevabı aynı zamanda bu uyarının neden ilk etapta kütüphaneye dahil edildiğini ve bunun yerine hangi yaklaşımı kullanmam gerektiğini neden daha iyi açıklıyor .


stuffCollection.Count()ayrı bir değişkende depolar ve bunu assert'e iletirseniz size aynı hatayı verir mi?
hellyale

Belki bu ?
Uwe Keim

Yanıtlar:


113

Xunit, uyarılarının çoğu için hızlı düzeltmeler sunar, bu nedenle "doğru" olduğunu düşündüğü şeyi görebilmeniz gerekir.

xunit

Sizin durumunuzda, Assert.Singletam olarak bir ürün beklediğiniz için kullanmanızı istiyor . 412 gibi gelişigüzel bir sayı iddia ediyor olsaydınız, kullanım hakkında size bir uyarı vermezdi Count. Yalnızca Singlebir ürün bekliyorsanız veya Emptyhiçbir ürün beklemiyorsanız kullanmanızı önerir .


6
Teşekkürler, mantıklı. FWIW, hızlı eylemin ortaya çıkmadığı VS Code'u oluştururken bunu görüyordum, bu yüzden aslında uyarı mesajına düzeltme önerisini dahil etmek çok daha yararlı olurdu.
Tomas Aschan

2
@TomasLycken - ah. Evet, burada bununla
vcsjones

5
Ben bu davranışın hayranı değilim; bazen 1 sayısı sadece rastlantısaldır ve .Single () çağrısını zorlamak daha az anlamlı görünür. Test, farklı bir sayım beklemek için değişebilir ve sadece bir sayıyı değiştirmek yerine tamamen farklı bir yöntemi çağırmak için değişiklik yapmak zorunda kalmak can sıkıcı görünmektedir.
vargonian

2
Tek, tek Öğe için harika, 3 öğem var ve tam Assert.Collection yazmak istemiyorum, xUnit'te Assert.Triple var mı? haha
Pawel Cioch

1
@PawelCioch göre xunit.net/xunit.analyzers/rules/xUnit2013.html sahip oldukları Empty, Singleve NotEmpty- sen xUnit2013 tetik olmamalı Dinamik bir değer bekliyoruz.
mbx

2

Bunun bana aynı hatayı verdiğini buldum:

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

Ve onu yayınlamak, hatanın görünmesini durdurdu.

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

2
Pek emin, bu kulüpler değil ideomatic yol.
mbx

1

Listedeki tek bir öğe için bunun yerine şunu kullanmak en iyisidir: Assert.Single(resultList);


-1

XUnit'te aşağıdaki gibi Count özelliğini kullandığımda aynı sorunu yaşadım.

görüntü açıklamasını buraya girin

Koleksiyonda Count () işlevini kullandıktan sonra sorunumu çözdü.


Sorun çözüldü, ancak yine de gerektiği gibi XUnit kullanmıyorsunuz!
Daniel Eisenreich

8
@DanielEisenreich, 1'den büyükse belirli bir sayı için saymanın doğru yolu nedir?
SomeGuyOnAComputer

@SomeGuyOnAComputer ve diğer 4 olumlu oy. Dediğimi unut, çok küstahtım. Daha büyükse, başka seçeneğin yok.
Daniel Eisenreich
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.