2009-12-08 9 views
8

MVVMパターンを使用してWPFアプリケーションを開発しています。PropertyChangedイベントテスト:これは良い方法ですか?

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

OnPropertyChangedがちょうどPropertyChangedイベントを発生させる基底クラスの仮想メソッドです:私はこのようなコードでのViewModelを持っています。 私が上げPropertyChangedイベントをテストしたいとそこに私の試験方法:

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")); 
    ... 
} 

はそれがProprtyChangedイベントをテストする良い方法ですか?

答えて

10

私はそれを正確に行うためにlittle Fluent APIを使用します。それはあなたがこのようにテストを書くことができます:

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

簡潔であることに加え、それはタイプセーフなので、私はこのアプローチを好む - 何の文字列値は、あなたのAPIと同期しておくんし。

複数のプロパティに対してイベントが発生していることをテストするには、これを行う別のテストを作成します。これは多くのテストを行いますが、それぞれが非常に小さくなり、Assertion Rouletteを回避します。

+0

素晴らしいです:それは、このようなユニットテストを書くことは非常に簡単ですWPF Application Framework (WAF)

!ありがとうございました。 – bniwredyc

+1

良いもの...私は自分のラッパーを書くつもりでしたが、私はまず最初にチェックしてみようと思っていましたが、ここでは> 8)xUnitを使うためにソリューションを少し微調整しました。ありがとう! –

1

私はあなたが示した例でPropertyChangedイベントを単体テストすることをお勧めします。プロパティー名の文字列を間違って記述したため、更新が失われている可能性があります。

Person person = new Person(); 
AssertHelper.PropertyChangedEvent(person, x => x.Name,() => person.Name = "Luke"); 
関連する問題