2016-12-30 55 views
1

うまくいけば、それはかなりシンプルですが、これを理解しようとしています。メッセージボックスが単体テストで正常に表示されたかどうかのテスト

私は何かをするメソッドを持つ単純なクラスを持っていて、いくつかの値が特定の状態にあるときにMessageBox.Show( "")を使ってメッセージボックスを表示すると、どのようにテスト/テストを書くのですか?予期しないときにメッセージボックスが表示されたかどうかを検出できます。

+4

[TestMethod] public void Test() { // Arrange var messageBox = new Mock<IMessageBox>(); messageBox .Setup(m => m.Show("TEST)) .Verifiable(); var sut = new SUT(messageBox.Object); // Act sut.Test(); // Verify messageBox.Verify(); } 
Iはインタフェースの背後にメッセージボックスを表示非表示になる:Moqと例えば

、。その後、そのインターフェイスを模擬して、あなたの模擬実装でカウンタなどを作成します。 –

+1

これは単体テストではありません。それがUIテストです。アクセシビリティAPIまたはVisual StudioのUIテストプロジェクト(アクセシビリティAPIを使用) –

+0

テストしたいメソッドと潜在的な単体テストを書くことができますか? – kat1330

答えて

3

ユニットテストでは、実際にテストすることはできません。コードが正しく呼び出されたかどうかをテストする簡単な方法があります。

インターフェイスの背後にMessageBoxが表示されているのを非表示にします。その後、そのインターフェイスを模擬して、あなたの模擬実装でカウンタなどを作成します。もちろん、これを必要なだけ具体的にすることもできます。

+0

もっと良いオプションは、MVVMや同様のパターンを使用してUIをバックエンドコードから分離することです。コントローラー/モデルを何か単位テストして、薄いUIビューのUIテストを使用することができます –

+0

もちろん、それはしばしばプログラムの全面的な修正を必要とします。このソリューションは、MVVMを最終的に使用する方法として実装する方が簡単です。 –

+0

OPは「メソッドがかなり大きい」というコメントにちょうど言及しました。つまり、UIとは独立して単体テストされる*ことを意味します。 BTW。 .NETは既に通知が発生したときにイベントとコールバックの両方を提供する 'IProgress 'インタフェースを提供しています。これによりユニットテストが少し楽になります –

0

MesssageBoxが表示されることをテストするべきではありませんが、他のUI自動化フレームワーク(https://msdn.microsoft.com/en-us/library/ms747327(v=vs.110).aspx )。

しかし、それは単体テストではありません。 automated UI testになります。

あなたが適切なユニットテストを作成したいのであれば、その後、あなたのクラスには、いくつかの

public interface IMessageBox 
{ 
    void Show(String message); 
} 

public class SUT 
{ 
    public SUT(IMessageBox messageBox) 
    { 
     this._messageBox = messageBox; 
    } 

    public void Test() 
    { 
     this._messageBox.Show("TEST); 
    } 
} 

あなたはunittestの内部mockそのIMessageBoxことができるようにしてinjectableでなければなりません。

+0

.NETはすでに 'IProgress'インターフェースを提供しています。さらに、インタフェースは、 'IMessageBox'のように実装に結びつけてはいけません。 –

+0

@ PanagiotisKanavosあなたは、より一般的な 'IProgress'メディエータによるUI責任からそのクラスを切り離すことが良いアイデアかもしれません。それは実際のシステムに依存しますが。しかし、私は「実装に結びついている」という部分を理解していませんか? IMessageBoxがインプリメンテーションに結びついている唯一の方法は、その名前であり、変更することができます。誰も誰かが 'Console.WriteLine(message) 'のようなConsoleMessageBoxを実装できないようにします。 Console.ReadKey(); ' IMessageBoxは明確な責任を負います。ビジネスロジックの深いところでこのようなインタフェースを使用しないでください。 –

関連する問題