NUnit'in Assert.Equals, "Assert.Equals iddialar için kullanılmamalıdır" istisnası atıyor


132

Yakın zamanda yeni bir NUnit testi yazarken Assert.Equals () yöntemini kullanmayı denedim. Yürütme üzerine bu yöntem , bunun ilk bakışta biraz şaşırtıcı AssertionExceptionolduğunu belirten bir ifade atar Assert.Equals should not be used for Assertions.. Burada neler oluyor?


Bize bunun içinde bulunduğu belirli kod gibi bir bağlam verebilir misiniz? Ne tür nesneleri vs. karşılaştırıyordunuz?
Mike Parkhill

9
Üzgünüm ama bunun cevabını çoktan buldum. Gelecek nesillerin cevabını gönderebilmek için sordum. Cevabı okuyarak göreceğiniz gibi bağlam gerçekten önemli değil. Bu cevabın, istisna mesajında ​​web aramasıyla kolayca keşfedilebileceğini umuyorum.
Odrade

Yanıtlar:


201

AssertC # 'da tüm sınıfların örtük olarak yaptığı gibi System.Object öğesinden miras alan statik bir sınıftır. System.Object aşağıdaki yöntemi uygular:

static bool Equals(object a, object b)

Eşitlik karşılaştırması için amaçlanan Assert üzerindeki Assert.AreEqual()yöntemler yöntemlerdir. Bu nedenle, Object.Equals()yöntemi bir birim testinde Assert sınıfı aracılığıyla çağırmak kesinlikle bir hatadır. Bu hatayı önlemek ve karışıklığı önlemek için, NUnit geliştiricileri, Object.Equalsbir istisna atan bir uygulama ile kasıtlı olarak Assert sınıfında gizlendi . İşte uygulama:

/// <summary>
 /// The Equals method throws an AssertionException. This is done
 /// to make sure there is no mistake by calling this function.
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 [EditorBrowsable(EditorBrowsableState.Never)]
 public static new bool Equals(object a, object b)
 {
     // TODO: This should probably be InvalidOperationException
     throw new AssertionException("Assert.Equals should not be used for Assertions");
 }

Elbette istisna mesajının kendisi kafa karıştırıcıdır, ancak en azından yanlış bir şey yaptığınızı bilmenizi sağlar .


13
Mesaj kafa karıştırıcı, ancak Google'a girin ve burada bu cevaba ulaşırsınız ve her şey yolunda. Teşekkürler Odrade.
Stephen Holt

25
NUnit'in geliştiricileri mesajı "... Assert.AreEqual () kullanın" şeklinde değiştirebilirler.
WillC

Neden bunun yerine Equals yöntemini özel yapmadılar?
shytikov

4
@shytikov Çünkü bu imkansız. Özel bir temel sınıftan sanal bir yöntemi geçersiz kılamazsınız.
Odrade

18

TLDR;

Assert.AreEqual(a, b); // <-- Compares a, b

değil:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
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.