[Отказ от ответственности: я не смог проверить это в 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, которая принимает только один аргумент; но поскольку этот метод защищен, у этого подхода есть свои недостатки.