2017-01-25 3 views
1

私はWinフォームでのビューを持っている:C#、Nunit、Moqプレゼンターがビューイベントを購読していることをテストする方法は?

public partial class View : Form, IView 
{ 
    private static object eventsLock = new Object(); 
    private EventHandler CustomClick; 

    public View() 
    { 
     InitializeComponent(); 
     this.button.Click += FireCustomClickEvent; 
    } 

    event EventHandler IView.Click 
    { 
     add { lock (eventsLock) { this.CustomClick += value; }} 
     remove { lock (eventsLock) { this.CustomClick -= value; }} 
    } 

    private void FireCustomClickEvent(object sender, EventArgs e) 
    { 
     this.CustomClick?.Invoke(sender, e); 
    } 

    public void MakeViewDoStuff() 
    { 
     //Do stuff... 
    } 
} 

IViewインタフェースは以下の通りです:

public interface IView 
{ 
    event Eventhandler Click; 
    void MakeViewDoStuff(); 
} 

そして、私はこのプレゼンターを持っている:

public class Presenter : IPresenter 
{ 
    private IView view; 
    public Presenter(IView view) 
    { 
     this.view = view; 
     this.AttachView(); 
    } 

    private void AttachView() 
    { 
     this.view.Click += SomePresenterStuff; 
    } 

    private void SomePresenterStuff(object sender EventArgs e) 
    { 
     this.view.MakeViewDoStuff(); 
     //Do stuff now that the event was raised. 
    } 
} 

今、私はそれをテストすることができますイベントが発生し、プレゼンターがビューをこのテスト機能で処理するようにします。

this.mockedView.Raise(v => v.Click += null, new System.EventArgs()); 
this.mockedView.Verify(v => v.MakeViewDoStuff(), Times.Once()); 

しかし、私が知りたいことは、プレゼンターがコンストラクタに付いていることをテストする必要がありますか?

基本的に、私はprivate void AttachView()がPresenterのコンストラクタで呼び出されていることをテストする必要がありますが、どうすればよいですか?

いくつかの注意:

私はそれだけでそれをテストできるようにするには、生産コードを変更関与していないだろうからであるプレゼンターの装着状態を維持するためにブール値のフラグを追加することが悪いハックの一種であることを考えますプロダクションで使用する。

EDIT:

上げたときに、プレゼンターはに解除すべきことを、私は種類のそれがプレゼンターresponsabilityや行動ではないかもしれないというセルゲイBerezovskiyに同意するが、私の見解ではCloseViewイベントを持っていたものならばビューイベントこれをテストしたくないですか?

+0

[Moqはまだイベント登録を確認できません](https://github.com/moq/moq4/issues/49) – stuartd

+0

@stuartdこのリンクはありがたいです有用な – Sebastien

答えて

1

私は、発表者の責任は

その場合はいくつかのものに

を行うことによって、イベントをクリックしてのを見ることを反応さ

であると考えている - プレゼンターはイベントにアタッチされたか気に誰が?それは、ビジネスロジックに関係しない技術的な詳細です。現在のテストでは、検証する必要のある内容が正確に検証されます。

あなたは

  • プレゼンターストアがプライベートフィールドで表示確認することができる技術的なものがたくさんありますか?
  • イベントに出席者が付いていますか?
  • プレゼンターは時間の経過とともに添付されますか?

ただし、プレゼンターが必要な方法でビューのイベントに反応しても問題はありません。

+0

よく、私はこのシナリオを持っていると言うことができます:私のビューはクローズイベントを持っており、プレゼンターはそのビューが発生したときにビューから離すべきです。これは、イベント登録のテストを希望する有効なケースではないでしょうか?または、私は単にプレゼンターのデストラクタのビューを解除する必要がありますか? – Sebastien

+0

@Sebastienはい、私はそれが有効なビジネス要件だと考えています。プレゼンターはCloseイベントに反応して、それ以上のイベントは反応がないはずです –

関連する問題