2009-01-20 17 views
5

'a eşit değilse, Google'ın tamamen açıklayamadığı garip bir davranışa rastladım.C# UnitTest - Assert.AreEqual(), argüman geçersizse


using Microsoft.VisualStudio.TestTools.UnitTesting; 

class TestClass 
{ 
    public override bool Equals(object obj) 
    { 
     return true; 
    } 
} 

[TestMethod] 
public void TestMethod1() 
{ 
    TestClass t = new TestClass(); 
    Assert.AreEqual (t, null); // fails 
    Assert.IsTrue (t.Equals (null)); // passes 
} 

Bu sınamanın başarılı olmasını beklerim. Ancak, Visual Studio 2008/.NET 3.5'de başarısız olur. Böyle olması mı yoksa bir böcek mi?

+1

NUnit'te beklenen değer her zaman ilk olduğundan, AreEqual() yöntemini sözleşmeden geriye doğru kullanıyorsunuzdur. Dokümanları n'ye karşı t ile karşılaştırırsa veya t'ye karşı neyse karşılaştırılamıyor, bu yüzden bu ayrımı güvenilir kılan bir testi aramadım. – Ken

cevap

15

TestSınıfınız Object.Equals numaralı sözleşmeyi ihlal ediyor. Assert.AreEqual, bu sözleşmeye oldukça makul bir şekilde güveniyor.

(gereksinimler listesinde) docs durumu:

  • x.Equals (null başvuru Visual Basic (Hiçbir şey)) false döndürür.
+0

Öyleyse son iddia neden geçiyor? T.Equals (null) 'ın yanlış ve geri dönüşü olmamalı, Assert.Istrue değil midir? –

+0

@borisCallens: İtici geçer * çünkü * uygulama sözleşmeyi ihlal ediyor. 't.Equals (null)' * yanlış * dönmelidir, ancak uygulamadan gerçekte geri döndüğünü görebilirsiniz, böylece kırık iddialar geçer. –

+0

Ah, Null durumunda çerçevenin gerçek uygulamayı atlayacağını ve yanlış döndüğünü varsayıyordum. –

5

Boşlukları sınarken, Assert.AreEqual'u kullanmayın.

Bunun için Assert.IsNull() kullanmanız gerekir.

1

İlk test başarısız. "T" değerinin sıfır olup olmadığını sınayın; bu, t'yi yeni bir TestClass nesnesiyle başlattığınız için değil.

İkinci test, geçer, çünkü t.Equals her zaman doğru döner.

Bir sınama başarısız olursa, tüm TestMethod1 başarısız olarak işaretlenir.

1

Hayır, doğru değil - yeni bir TestClass nesnesine sıfırlamadınız, bu da null değerine sahip değil, bu nedenle onaylama işlemi başarısız oluyor.

0

Seni doğru anlarsam, aslında AreEqual(anythingButNull, null) her zaman yanlış mı döndürülmesi isteniyor?

(değiştir) Merak ettiğim neden, Eşitlik sözleşmesinin gerektirdiği gibi, null sınavı, sınıfa karşı yazılmadığı zaman çağrılmamasıdır. Bu nedenle AreEqual sözleşmeye dayandığından, sınıfımın sözleşmeye de uygun olup olmadığını kontrol edemez. Yani sanırım Assert.IsFalse(blah.Equals(null))'un geçici çözümünü kullanmalıyım.

+0

Evet, tam olarak Object.Equals için dokümanlar bölümünde belirtildi. –

+0

Evet, çünkü, sadece konuşuldu, (! Null == null) false değerini döndürmek zorunda. – Xn0vv3r

İlgili konular