2017-01-25 1 views
1

У меня есть мнение, который является WinForm: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:

Я отчасти согласен с Сергеем Березовским, что она не может быть ведущей ОТВЕТСТВЕННОСТЬЮ ни поведение, но что, если мое мнение было событие CloseView, что при подъеме, ведущая должны отказаться от подписки на события просмотра. Разве мы не хотим проверить это?

+0

Вы хотите проверить это в издеваемом виде, но [Moq все еще не может подтвердить регистрацию событий] (https://github.com/moq/moq4/issues/49) – stuartd

+0

@stuartd Спасибо, эта ссылка была очень полезно – Sebastien

ответ

1

Я считаю, что ответственность презентующего является

реагирующих для просмотра Нажмите на событие, делая некоторые вещи

Если это случится - кто заботится, как ведущий был привязан к событию? Это просто технические детали, не связанные с бизнес-логикой. Ваш текущий тест точно проверяет, что должно быть проверено.

Есть много технических вещей, которые вы можете проверить

  • презентер магазинов смотреть в частной сфере?
  • ведущий присоединяется к мероприятию?
  • ведущий остается прикрепленным со временем?

Но это не имеет большого значения, пока ведущий реагирует на событие вида в требуемом порядке.

+0

Ну, скажем, у меня такой сценарий: у моего представления есть близкое событие, и ведущий должен отвлечься от представления, когда он поднят. Разве это не было бы правильным случаем, когда вы хотели бы протестировать регистрацию событий? Или я должен просто отключить представление в деструкторе ведущего? – Sebastien

+0

@ Sebastien да, я считаю, что это действительное деловое требование - ведущий должен реагировать на событие Close, чтобы любые дальнейшие события не имели никаких реакций –

Смежные вопросы