Как проверить подписку на событие, используя Moq - PullRequest
1 голос
/ 21 февраля 2011

Я использую шаблон MVVM и silverlight 4.0 и Moq для тестирования.В конструкторе модели представления я передаю объект IEventAggregator.Этот объект используется для подписки на событие с именем SelectionChangedEvent.

В тестовом методе я делаю так:

this.selectedEvent = new Mock<SelectionChangedEvent>();
this.eventAggregator.Setup(x => x.GetEvent<SelectionChangedEvent>()).Returns(this.selectedEvent.Object);
var viewModel = new ViewModel(this.eventAggregator);

Я хочу проверить, что событие получает подписку, когда конструкторназывается.Как я могу это проверить?

1 Ответ

4 голосов
/ 22 февраля 2011

[Отказ от ответственности: я не смог проверить это в Silverlight]

Вот возможное решение, которое в основном выполняет обратный вызов для установки внешнего логического значения, когда Subscribe вызывается для события. См. Комментарии ниже, хотя.

[Test]
public void Constructor_CallsSubscribeOnSelectionChangeEvent()
{
  var subscribeCalled = false;
  var selectedEvent = new Mock<SelectionChangedEvent>();
  var eventAggregator = new Mock<IEventAggregator>();

  selectedEvent
    .Setup(x => x.Subscribe(
      It.IsAny<Action<object>>(),
      It.IsAny<ThreadOption>(),
      It.IsAny<bool>(),
      It.IsAny<Predicate<object>>()))
    .Callback<Action<object>, ThreadOption, bool, Predicate<object>>
      ((action, option, f, pred) => { subscribeCalled = true; });

  eventAggregator
    .Setup(x => x.GetEvent<SelectionChangedEvent>()).Returns(selectedEvent.Object);

  var viewModel = new ViewModel(eventAggregator.Object);

  Assert.That(subscribeCalled, Is.EqualTo(true));
}

Вышеупомянутое довольно уродливо, в основном из-за того, что единственная фиктивная (виртуальная) перегрузка метода подписки на событие принимает четыре аргумента и что типы аргументов Callback () не могут быть выведены автоматически - что приводит к большим "постороннего" кода.

Альтернативой может быть вместо этого насмешка EventBase.InternalSubscribe, которая принимает только один аргумент; но поскольку этот метод защищен, у этого подхода есть свои недостатки.

...