私は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イベントを持っていたものならばビューイベントこれをテストしたくないですか?
[Moqはまだイベント登録を確認できません](https://github.com/moq/moq4/issues/49) – stuartd
@stuartdこのリンクはありがたいです有用な – Sebastien