C#,Nunit,Moq如何测试演示者是否订阅了它的观看事件?

时间:2017-01-25 18:50:44

标签: c# unit-testing nunit moq mvp

我认为谁是一个winform:

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());

但我想知道的是:我应该测试演示者是否在其构造函数中附加?

所以基本上,我应该测试在Presenter的构造函数中调用private void AttachView(),我该怎么做?

一些注意事项:

我认为添加一个布尔标志来保持演示者的附加状态是一种糟糕的黑客攻击,因为它只涉及更改生产代码以便能够测试它并且不会在生产中使用。

修改

我有点同意谢尔盖·别列佐夫斯基,它可能不是主持人的责任也不是行为,但如果我的观点有一个CloseView事件,那么当提出时,演示者应该取消订阅视图事件。我们不想测试这个吗?

1 个答案:

答案 0 :(得分:1)

我相信演示者的责任是

  

通过执行某些操作

来查看以查看Click事件

如果发生这种情况 - 谁关心主持人是如何加入活动的呢?这只是与业务逻辑无关的技术细节。您当前的测试确切地验证了应该验证的内容。

您可以验证很多技术资料

  • 演示者将视图存储在私有字段中?
  • 演示者是否附上活动?
  • 主持人随着时间的推移保持联系?

但是,当主持人以必要的方式对观看事件作出反应时,这并不重要。