2015-08-11 28 views
5

Birim Testleri yazıyor ve IClonable'u uygulayan türde bir senaryoyu düşünüyorum. Tabii ki Clone() yöntemini sınayan bir Birim Testine sahip olmak istiyorum.Birim Testi: Klonlama ve eşitlik

[Test] 
public void CloneObject() 
{ 
    MyType original = new MyType(); 
    MyType clone = (MyType)original.Clone(); 

    // Assert for equality 
} 

Yani benim ilk görev eşitlik için bir Assert olması. Aşağıdaki seçeneklere bakın: MyType tüm özellikleri (alanları) geçmekte

  • ve iki örnekleri eşit olup olmadığını MyType diyelim MyType bir
  • geçersiz kılma Equals() teker kontrol (testler için bazen eşitlik olduğunu düşünün üretim kodu için eşitlik) serileştirme çeşit
  • kontrol edin örnekleri (eşitse farklı kabul MyType[Serializable] olması gerekir, ama bu bazen) mesela Arayüz Özellikler 'varsa yapmak zor olduğu senaryo için
  • ... ??

İlk iki için testlerimi kurabilirim ve iyi çalışıyorlar. Ama ne MyType değiştirirseniz ve ek bir özellik eklerseniz? Clone() bunu kopyalamaz ve ben işaretli özellikleri veya eşitleme yöntemi listesine eklemezseniz, özellik kopyalanmasa bile benim sınama hala geçer.

Bu tür testleri nasıl çözersiniz? karşılaştırma algoritması isteğe options ile özelleştirilebilir

original.ShouldBeEquivalentTo(clone); 

:

+0

ikili serileştirme aynı sınırlamalara muzdarip olduğunu Json (de) seri hale düşünülen veya does var ('[Serializable]') görüşünüzde mi? –

cevap

5

iki nesne graph comparison gerçekleştiren bir ShouldBeEquivalent yöntemi vardır FluentAssertions kitaplığı (bir TDD, IMO olması gerekir) kullanabilir parametre; Ayrıntılı bilgi için wiki numaralarına bakınız.

(yeni özellikler sınıfına eklendiğinde yani kırılır, ancak Clone yöntemine değil) testi geleceğe hazır hale getirmek için, rastgele olarak ayarlanmış tüm özelliklere sahip bir nesne klonlama test etmek isteyebilirsiniz varsayılan olmayan değerler. AutoFixture bunu sizin için yapabilir.

// Arrange 
var fixture = new Fixture(); 
var original = fixture.Create<MyType>(); 

// Act 
var clone = original.Clone(); 

// Assert 
clone.ShouldBeEquivalentTo(original); 

Faydalı linkler:

+0

Teşekkürler! Bu benim için çalışıyor :) – joerg

+0

@joerg no prob! FluentAssertions ile başka neler yapabileceğinizi kontrol ettiğinizden emin olun - iyilerle dolu! – dcastro

+0

Oops ... bir adım geri ... Ben sadece bir 'int' türüme ekledim ... Testimde başarısız olmak için varsayılan olmayan bir değer ayarlamak zorundayım ... sadece bu özelliği ve testi eklemek hala geçer ... – joerg

0

Ben Eşittir uygulayan yarayacagindan(). Equals() 'ın testlerde üretimde farklı sonuçlara neden ihtiyaç duyduğuna dair bir neden göremiyorum. Bunu yapmazsanız şöyle

, senin belirt, object.ReferenceEquals() diyebiliriz:

Assert.IsTrue(object.ReferenceEquals(expectedObject, objectInHand)); 
+0

[this] (http://blog.ploeh.dk/2012/06/22/Test-specificEqualityversusDomainEquality/) dosyasını çok yararlı buldum ... ReferenceEquals, false iddiasında bulunmalıdır çünkü klon, farklı bir referansa sahip olmalıdır. orijinal – joerg