2011-07-28 18 views

答えて

11

- 彼らは:だから、あなたは本当にメンバーをテストしていないが、さらにもう一度、彼らは、特定の順番にペアでテストしなければならない意味のコマンドを、テストしていますクラスのpublic interfaceの一部ではありません。これは、パブリックICommandプロパティのためのものです。

+0

+1パブリックインターフェイスをテストします。 –

+0

私のクラスにはインターフェイスはありませんが、それは単なるクラスです。 – michael

+3

@michaelクラスの「public」メソッドとプロパティのコレクションは、消費者がそのクラスとどのようにインターフェースするかという点で、そのクラスの「インターフェース」と見なされます。 – dlev

4

個人的に私はプライベートな方法で行くつもりですが、その理由を教えてください。 ICommandが公開されています。これは、消費するビューがExecuteを呼び出す前にCanExecuteを呼び出す必要があると言います。もしそうでなければ、彼らはAPIに逆らって足に自分自身を射撃し、その時点であなたの手からは外れています。誰かがリフレクションを使用して重要なプライベート変数をnullに設定し、これによりクラスデザインを破ったように、足で自分自身を撃ったように。ではなぜメンバーをプライベートにするのですか?直接呼び出されるべきではないメンバーを公開する必要はないからです。


は基本的に、あなたはユニットあなたが個別にそうしていないメンバーをテストするとき、あなたはAPIが実行されるメンバーのために意図した方法で行ってください。私は彼らがプライベートになるだろう

if (CanExecute) 
{ 
    Execute; 
} 
+0

かなり編集を実行INotifyPropertyChangedの行動とのICommandをテスト - または私はちょうど何かを逃しました? :) –

+0

@chibacity:時々私は暴言をす​​る傾向があります。私は単体テストになる前に似たようなことを尋ねましたが、誰かがAPIに反対すると、それがその上にあると私に言ったのです。あなたは、これまでのところ、適切な図書館やアプリを破壊しないように誰かを守るだけです。 –

2

私は、何かの単純なコントロールの増加、減少ボタンとスライダの表示値のためのMVVMを持っています。

あなたは、テストのICommandとINotifyPropertyChangedのを持っている場合は、unittestのの種類作ることができます:あなたが見ることができる

[TestMethod] 
public void TestViewModel3() 
{ 
    int min = -10; 
    int max = 10000; 
    int initVal = 50; 
    bool initState = false; 

    ToglledSliderModel model = new ToglledSliderModel(initState, initVal, min, max); 
    ToglledSliderViewModel viewModel = new ToglledSliderViewModel(); 
    viewModel.Model = model; 

    int status = 567; 
    viewModel.PropertyChanged += delegate 
    { 
     status = 234; 
    }; 

    for (int i = 1; i < 100; i++) 
    { 
     status = 567; 
     ICommand ic = viewModel.IncreaseValue; 
     ic.Execute(this); 
     Thread.Sleep(2); 
     Assert.AreEqual(status, 234); 
     Assert.AreEqual(model.SliderValue, initVal + i); 
    } 
} 

を、私は

関連する問題