2012-06-21 19 views
5

C# kodumu test etmek için XUnit framework kullanıyorum.XUnit Nesnelerin eşitliğini denetlemek için onaylama

Bu çerçevede nesne karşılaştırması yapan herhangi bir iddia yöntemi var mı? Amacım, nesnenin genel ve özel üye değişkenlerinin her birinin eşitliğini kontrol etmektir.

O alternatifler denedim ama nadiren çalışır: Aksi onlar aynı atıfta olup olmadığını temelinde kontrol edilir nesneleri karşılaştırmak

1) bool IsEqual = (Obj1 == Obj2) 
2) Assert.Same(Obj1, Obj2) which I couldnt understand what happens internally 
+1

xUnit'te "derin karşılaştırma" var. Nesneleriniz için IEquatable uygulamanız gerekecek ve ardından Assert.Equals çalışacaktır. – seldary

+1

'Assert.Same()' referans ile karşılaştırır; Obj1 ve Obj2’nin ** aynı ** nesneyi değil, ** aynı ** nesnesi olduğunu iddia eder. – TeaDrivenDev

cevap

6

Sen, bunu başarmak için özel bir karşılaştırıcısı olması gerekir bellekteki nesne. Eğer Equals ve GetHashCode yöntemini geçersiz gerekir ve daha sonra yapabileceği bu davranışı geçersiz kılmak için: Ayrıca http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

apt soru üzerine açıklama:

İşte
Assert.True(obj1.Equals(obj2)); 

bir MSDN sayfa Abt aşırı yükleme olduğu yöntem Eşittir What's the difference between IEquatable and just overriding Object.Equals()?

+1

Özel "Equals" yöntemini uygulayarak bu kontrolün gerçekleştirilebileceğini anlıyorum. Ama kontrolü daha kolay hale getirecek bir kör bayt karşılaştırması yapmak için herhangi bir yöntem var mı? Bunun nedeni, sadece "test altındaki Yazılım" da "Eşittir" uygulamasına sahip olmanın sadece ünite testi için yapıldığıdır. – inquisitive

+1

Her iki nesneyi bayt dizisine dönüştürmek için seri hale getirme yöntemlerini denedim ve çalıştı. Ancak, özel üye değişkenleri olan sınıfıma [serileştirilebilir] özniteliği ekleme kısıtlamasıyla birlikte gelir. Tasarım perspektifinde bu iyi değil sanırım – inquisitive

8
ben benzer bir sorunu vardı

, ama sonra Neyse ki zaten kullanıyorum

using Newtonsoft.Json; 

Bu yüzden json nesnesine serileştirmek zorunda kaldım, sonra string olarak karşılaştırdım.

var obj1Str = JsonConvert.SerializeObject(obj1); 
var obj2Str = JsonConvert.SerializeObject(obj2); 
Assert.Equal(obj1Str, obj2Str); 
+0

Bu bir Eşit yöntemini uygulamaktan daha yararlı olduğunu düşünüyorum çünkü yanlış olanı hakkında bana bir şey söylemediğimi iddia ediyorum. İdeal olarak, bir nesne ağacını hareket ettirebilecek ve hangi özelliklerin/alt alanların eşit olmadığı ve bu bilgilerle ilgili başarısız olduğu hakkında bilgi biriktirebilecek bir şey elde etmektir. –

+0

@RikkiGibson uygulamıyor Eşittir, bunu yapmak için doğru yol? Sadece farklı olan her özellik için eşitliklerde bir listeye istisnalar ekleyin, ya da sonunda ya true ya da tüm istisnaları –

+0

Evet at, ama duruma göre yapmak için özenli olabilir, bu yüzden ben de Geçmişteki yansıma temelli çözümleri, eski düz nesneleri, temelleri ve koleksiyonları ağaçlarıyla karşılaştırırken arayın. –