我有一個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
}
對於我的生活,我想不出什麼我做錯了 - 我俯瞰東西... DO我必須在模擬中設置事件的發佈事件?我應該使用真正的ItemDeletedEvent實例而不是模擬嗎?任何幫助將不勝感激。
你當然是我根據我的代碼! :-)謝謝你的幫助,托馬斯。 –
我只是沒有得到區別 - 我記得你在課程中提到它。有什麼辦法可以配置EventAggregator來做_both_嗎? –
兩者都是什麼意思?問題在於發佈/訂閱邏輯不在Event聚合器中,它在Event類中。因此,爲了測試訂閱,您應該使用真實的事件類。如果您不使用真實的Event類,而是模擬,那麼您需要設置Subscribe方法並手動存儲訂閱方法並手動調用它們。 –