如何在使用Prism处置ViewModel时验证EventAggregator的取消订阅方法
问题描述:
我正在努力编写一个测试,以确认在关闭时正确取消订阅EventAggregator的消息。任何人都可以指出(简单)的答案?!如何在使用Prism处置ViewModel时验证EventAggregator的取消订阅方法
下面是代码:
public class ViewModel : BaseViewModel, IViewModel
{
private readonly IEventAggregator eventAggregator;
private SubscriptionToken token;
IssuerSelectedEvent issuerSelectedEvent;
public ViewModel(IView view, IEventAggregator eventAggregator)
{
this.eventAggregator = eventAggregator;
View = view;
issuerSelectedEvent = eventAggregator.GetEvent<IssuerSelectedEvent>();
token = issuerSelectedEvent.Subscribe(SelectedIssuerChanged, true);
}
private void SelectedIssuerChanged(IssuerSelectedCommand obj)
{
Console.WriteLine(obj);
}
public IView View { get; set; }
public override void Dispose()
{
issuerSelectedEvent.Unsubscribe(token);
}
}
测试失败:
Moq.MockVerificationException:下面设置不匹配: IssuerSelectedEvent X => x.Unsubscribe(It.IsAny ())
下面是测试:
[Test]
public void UnsubscribeFromEventAggregatorOnDispose()
{
var view = new Mock<ICdsView>();
var ea = new Mock<EventAggregator>();
var evnt = new Mock<IssuerSelectedEvent>();
evnt.Setup(x => x.Unsubscribe(It.IsAny<SubscriptionToken>()));
var vm = new CdsIssuerScreenViewModel(view.Object, ea.Object);
vm.Dispose();
evnt.VerifyAll();
}
答
在这里,我核实了Unsubscribe
被称为上嘲笑IssuerSelectedEvent
[Test]
public void UnsubscribeFromEventAggregatorOnDispose()
{
var view = new Mock<ICdsView>();
var ea = new Mock<IEventAggregator>();
var evnt = new Mock<IssuerSelectedEvent>();
ea.Setup(x => x.GetEvent<IssuerSelectedEvent>()).Returns(evnt.Object);
var vm = new CdsIssuerScreenViewModel(view.Object, ea.Object);
vm.Dispose();
evnt.Verify(x => x.Unsubscribe(It.IsAny<SubscriptionToken>());
}
如果您想检查确切的相同标记传入Unsubscribe
那么您将需要Setup
作为Subscribe
方法,该方法返回您在测试中创建的标记。
答
你需要告诉你的EventAggregator
模拟来回报您的嘲笑IssuerSelectedEvent
:
ea.Setup(x => x.GetEvent<IssuerSelectedEvent>()).Return(evnt.Object);
答
测试需要改为:
[Test]
public void UnsubscribeFromEventAggregatorOnDispose()
{
var view = new Mock<ICdsView>();
var ea = new Mock<IEventAggregator>();
var evnt = new Mock<IssuerSelectedEvent>();
ea.Setup(x => x.GetEvent<IssuerSelectedEvent>()).Returns(evnt.Object);
evnt.Setup(x => x.Unsubscribe(It.IsAny<SubscriptionToken>()));
var vm = new CdsIssuerScreenViewModel(view.Object, ea.Object);
vm.Dispose();
evnt.VerifyAll();
}
谢谢 - 我尝试之前,得到了 'System.NotSupportedException:无效设置一个非虚拟(在VB重写)构件上:X => x.GetEvent()' 当然,我也需要为IEventAggregator创建一个模拟,而不是EventAggregator,所以现在可以工作 –