【发布时间】:2016-04-24 02:46:19
【问题描述】:
我有一个 Autofac DI 容器,定义如下:
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 吗?任何帮助将不胜感激。
【问题讨论】:
标签: unit-testing mvvm moq prism autofac