2009-04-19 10 views
22

Visual Studio Professonal 2008'in test yeteneklerinde ilk, başarısız bir birim sınaması oluşturmaya çalışırken, Assert.ReferenceEquals() no'lu telefon numarasını elde edemiyorum. Bir nesne örneği boş değere eşit değilken doğru bir şekilde başarısız olur. Aynı karşılaştırma için object.ReferenceEquals()'un false doğru şekilde döndüğünü unutmayın. static object TheObject özelliği asla yüzden, static void Startup(object) yöntem boş olduğunuAssert.ReferenceEquals() Visual Studio Testinde Object.ReferenceEquals() öğesi 'false' döndürdüğünde geçer

[TestClass()] 
public class ProjectTest 
{ 
    [TestMethod()] 
    public void StartupTest() 
    { 
     object obj = "hello"; 
     Project.Startup(obj);  
     Assert.ReferenceEquals(obj, Project.TheObject); // Test Passes!?! 
    } 
} 

Not:

public static class Project 
{ 
    public static object TheObject { get; set; } 

    public static void Startup(object theObject) 
    { 
     // ToDo: Project.Startup(): Test. 
     // ToDo: Project.Startup(): Implement. 
    } 
} 

Ve sonra burada benim test sınıfının temel özelliği şunlardır: Burada

benim sınıf kodu ve null kalır. Yani, açıkça, Assert.ReferenceEquals(obj, Project.TheObject) başarısız olmalı, ancak bir şekilde bu test geçer. doğru için

Assert.IsTrue(object.ReferenceEquals(obj, Project.TheObject))

nedenleri bu test için

Assert.ReferenceEquals(obj, Project.TheObject)

değişen

Not başarısız olur.

Bu çok basit görünüyor ve yine de neyin yanlış gittiğini göremiyorum. Birisi hatalarımın yolunu çizebilirse, çok fazla zorlanırdım. peşin

sayesinde

Mike James Avery tarafından Yanıtlanmış

Güncelleme:

Ah, şimdi nasıl hissettiğini saçma bir. I ,'un böyle bir şey olması gerektiğini biliyordu. Vay.

Yeterli, 'GoToDefinition' beni 'Object.ReferenceEquals()'. Bu yüzden, "Assert.ReferenceEquals()" yazıp, benim durumumda sessizce "yanlış" olan gerçekten System.Object.ReferenceEquals() yazıyor. Bu, elbette, bir iddiada başarısızlıkla ilgili hiçbir şey yapmaz, bu nedenle testi,'u geçer. Şaşırtıcı.

Teşekkürler James.

+0

Sadece bu aynı aptalca hata ile çarptı. Düşmek çok kolay bir tuzak. Ünite test dersleri, asıl iddiaların girilmemesi durumunda en azından bir uyarıda bulunabileceği gibi görünüyor. En azından yukarıdaki örnek kodunuz ve benim gerçekleştirmeye çalıştığım özellik kontrolü gibi çok basit vakaları yakalayacağım. –

+0

"Ünite test dersleri, en azından gerçek bir İddianamenin çağrılmadığı durumlarda uyarı verebiliyor gibi görünüyor." Bu oldukça ilginç bir fikir ve sadece bu aptal tuzağa karşı korumak için değil. Bunu sevdim. –

+2

Yine de daha iyi bir fikir, Assert sınıfının 'ReferenceEquals' adı verilen ve 'Object.ReferenceEquals' yöntemini gölgeleyecek yeni bir statik yöntem oluşturması ve daha sonra uygun bir hata iletisiyle ObsoleteAttribute ile bu yöntemi işaretlemesidir. Bu şekilde, kullanıcı bu hatayı yapsa uyarılırdı. –

cevap

30

Çağırdığınız ReferenceEquals yöntemi, tüm başvuru nesnelerine uygulanan statik yöntemdir, test çerçevesinin bir parçası değildir. Eğer bakarsanız, bir boole değeri döndürürken, normal bir onaylama geçersiz olur. Bu kesinlikle kafa karıştırıcı, .AreSame() sizin aradığınız iddiasıdır.

+1

Ah, şimdi ne kadar aptal hissediyorum. Biliyordum * böyle bir şey olmalıydı. Vay. Tabii ki, 'GoToDefinition' beni 'Object.ReferenceEquals()' için alır. Bu nedenle, "Assert.ReferenceEquals()" yazıp, benim durumumda sessiz bir şekilde 'yanlış' döndüren Object.ReferenceEquals() yazıyor. Bu, tabiki gerçekten de bir iddiada başarısızlıkla ilgili hiçbir şey yapmıyor. Yani test ** geçer *. Şaşırtıcı. Teşekkürler James. –

+1

Benzer bir soruna girdim ve NUnit, onaylar için ReferenceEquals kullanılmamasını belirten bir özel durum atar. Bunu önerdiğiniz gibi Assert.AreSame() olarak değiştirdim. Açıkça bir istisna atmak için Assert.ReferenceEquals() 'i geçersiz kıldılar, ancak neden beklediğimiz şeyi yapmak için işlevi geçersiz kılmıyoruz? –