2012-03-14 11 views
5

私はTDDで「初心者」だ、と私は理解しようとしている何かがあるどのようにユニットテストのviewmodelsを...私はプロパティProeprtyChangedイベントが発生していることを確認したいと思っていますテストのViewModelのPropertyChangedイベントは

へ。私は以下のテストをnunitで行っています。

[Test]   
public void Radius_Property_Changed() 
{ 
    var result = false; 
    var sut = new MainViewModel(); 
    sut.PropertyChanged += (s, e) => 
    { 
     if (e.PropertyName == "Radius") 
     { 
      result = true; 
     } 
    }; 

    sut.Radius = decimal.MaxValue; 
    Assert.That(result, Is.EqualTo(true)); 
} 

これは、これを行うためのクリーンな方法です、またはこのプロパティ

をテストする良い方法はあります...私はこのようなルックスをテストしていpropetyののviewmodelのコードのスニペット..

public decimal Radius 
{ 
    get { return _radius; } 
    set 
    { 
     _radius = value; 
     OnPropertyChanged("Radius"); 
    } 
} 

答えて

4

これはあなたがそれを行う方法とほぼ同じです。それは非常に単純な(そして退屈な)コードであるため、ここで行うことはあまりありません。あなた自身の再利用可能なライブラリ/ツールでそれを囲むことは価値があるかもしれません。またはそれ以上に、use existing code

+0

私は...提案 –

1

この種のものについて私自身の「最小限の」テストはわずかに異なります。イベントが発生しているかどうかを確認する代わりに、私は通常が正確に1回になることを確認します。これは、MSTestをに基づいていますが、簡単にNUnitので動作するように、それを書き換えることができ

[TestMethod] 
    public void ChangeTrackingModelBase_BasicFunctionalityTest() 
    { 
     var person = new ChangeTrackingPerson(); 
     var eventAssert = new PropertyChangedEventAssert(person); 

     Assert.IsNull(person.FirstName); 
     Assert.AreEqual("", person.LastName); 

     eventAssert.ExpectNothing(); 

     person.FirstName = "John"; 

     eventAssert.Expect("FirstName"); 
     eventAssert.Expect("IsChanged"); 
     eventAssert.Expect("FullName"); 

     person.LastName = "Doe"; 

     eventAssert.Expect("LastName"); 
     eventAssert.Expect("FullName"); 

     person.InvokeGoodPropertyMessage(); 
     eventAssert.Expect("FullName"); 

     person.InvokeAllPropertyMessage(); 
     eventAssert.Expect(""); 

    } 

http://granite.codeplex.com/SourceControl/list/changesets

+0

良い点への感謝を[テストケース]を使用して、それをリファクタリングし、より汎用的な作られている - –

1

花崗岩のテストフレームワークを使用すると、このようなテストを書くことができます。 github

それは価値がパブリックプロパティの設定されているときに、プロパティ変更イベントが発生した場合determinするためにリフレクションを使用しています。

+0

感謝を考慮に値する何かを、私は花崗岩をチェックアウトします - この私に統合テストのように見えるが、確かに私がカバーしたいと思っているもの –

+0

統合テスト?いいえ、エクステンタル・サービスやデータベースとは話していません。 –

0

私はあなたがこのために使用できる簡単なクラスを作りました。

例:


[TestMethod] 
public void Properties_WhenSet_TriggerNotifyPropertyChanged() 
{ 
    new NotifyPropertyChangedTester(new FooViewModel()).Test(); 
} 
関連する問題