2009-12-08 18 views
8

MVVM desenini kullanarak WPF uygulamaları geliştiriyorum. Böyle koduyla ViewModel vardır:PropertyChanged etkinlik testi: Bu iyi bir yoldur?

public bool EditModeEnabled 
{ 
    get { return _EditModeEnabled; } 
    set 
    { 
     _ModeEditModeEnabled = value; 
     OnPropertyChanged("EditModeEnabled"); 
     OnPropertyChanged("CommentTextBoxVisibility"); 
    } 
} 

OnPropertyChanged sadece PropertyChanged olay yükseltmek temel sınıf sanal yöntemdir. o ProprtyChanged olayı test etmek için iyi bir yoldur

public void EditModeEnabledTest() 
{ 
    var imageViewModel = TestHelper.GetTestImageViewModel(); 
    var firedEvents = new List<string>(); 
    imageViewModel.PropertyChanged += ((sender, e) => firedEvents.Add(e.PropertyName)); 
    imageViewModel.Mode = true; 
    Assert.AreEqual(firedEvents.Count, 2); 
    Assert.IsTrue(firedEvents.Contains("EditModeEnabled")); 
    Assert.IsTrue(firedEvents.Contains("CommentTextBoxVisibility")); 
    ... 
} 

mi: benim test yöntemi vardır yükselterek PropertyChanged olayı test etmek ister misin?

cevap

10

Tam olarak bunu yapmak için little Fluent API kullanıyorum. Bu böyle testler yazmasına olanak tanır:

var imageViewModel = TestHelper.GetTestImageViewModel(); 
imageViewModel.ShouldNotifyOn(s => s.EditModeEnabled) 
    When(s => s.Mode = true); 

özlü olmanın yanı sıra bu tip-güvenli, çünkü bu yaklaşım tercih - hayır dize değerleri API'nızdan ile senkronize tutmak için.

Etkinliğin birden fazla özellik için yükseltildiğini sınamak için, bunu yapan başka bir sınama da yazabilirsiniz. Bu size birçok test verecektir, ancak her biri çok küçük olacaktır ve Assertion Roulette'dan kaçınmalısınız.

+0

: WPF Application Framework (WAF) ile

böyle bir birim test yazmak çok kolay! Teşekkür ederim. – bniwredyc

+1

İyi şeyler ... Kendi ambalajımı yazmak üzereydim, ama önce SO'yı kontrol edeceğimi düşündüm ve burada ...> 8) Çözümünüzü xUnit kullanmak için biraz değiştirdim. Teşekkürler! –

1

Gösterilen örnekte PropertyChanged olayını test etmenin iyi bir fikir olduğuna inanıyorum. Eksik bir güncelleme ile sonuçlanacak özellik adı dizesini yanlış yazmış olabilirsiniz. müthiş

Person person = new Person(); 
AssertHelper.PropertyChangedEvent(person, x => x.Name,() => person.Name = "Luke"); 
İlgili konular