У меня есть Autofac DI Контейнер определяется следующим образом:Почему моя подписка на EventAggregator не обрабатывает это событие?
public class Bootstrapper
{
public IContainer BootStrap()
{
var builder = new ContainerBuilder();
builder.RegisterType<ItemViewModel>().AsSelf();
builder.RegisterType<EventAggregator>()
.As<IEventAggregator>()
.SingleInstance();
}
}
У меня есть юнит-тесты, определенные для проверки удаляет ли удаление удаленного элемент из коллекции:
[Fact]
public void Should_remove_item_from_collection_when_item_is_deleted()
{
const int deletedId = 42;
// adds three items to the collection
_openItemEditViewEvent.Publish(deletedId);
_openItemEditViewEvent.Publish(8);
_openItemEditViewEvent.Publish(9);
// I've tried this:
_eventAggregatorMock.Object.GetEvent<ItemDeletedEvent>().Publish(42);
// and alternatively, this (not at the same time):
_itemDeletedEventMock.Object.Publish(42);
Assert.Equal(2,_vm.ItemEditViewModels.Count); // always fails
Assert.False(_vm.ItemEditViewModels
.Select(vm => vm.Item.Id).Contains(42), "Wrong item deleted");
}
Конструктор блока Тест инициализирует и присваивает EventAggregator модели вида:
_eventAggregatorMock = new Mock<IEventAggregator>();
_itemDeletedEventMock = new Mock<ItemDeletedEvent>();
_eventAggregatorMock.Setup(ea => ea.GetEvent<ItemDeletedEvent>())
.Returns(_itemDeletedEventMock.Object);
_vm = new ItemViewModel(_eventAggregatorMock.Object, */ ... /*);
в моей реальной модели представления, я подписываюсь на событие:
public ItemViewModel(IEventAggregator ea, /* ... */)
{
_eventAggregator.GetEvent<ItemDeletedEvent>()
.Subscribe(OnItemDeleted, true);
}
И мы никогда не попали в точку останова здесь:
public void OnItemDeleted()
{
// never happens
}
Для жизни меня, я не могу понять, что я делаю неправильно - я что-то с видом ... не Мне нужно настроить событие публикации в Mock? Должен ли я использовать реальный экземпляр ItemDeletedEvent вместо Mock? Любая помощь будет принята с благодарностью.
Ваш курс, что я на основе моего кода на! :-) Спасибо за помощь, Томас. –
Я просто не получал различие - я помню, вы упомянули об этом в курсе. Есть ли способ настроить EventAggregator на выполнение _both_? –
Что вы подразумеваете под этим? Проблема заключается в том, что логика публикации/подписки отсутствует в агрегаторе Event, она находится в классе Event. Поэтому для тестирования подписки вы должны использовать реальный класс событий. Если вы не используете настоящий класс Event, но макет, вам нужно установить метод Subscribe и сохранить методы подписки вручную и вызвать их вручную. –