如何在使用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); 
+0

谢谢 - 我尝试之前,得到了 'System.NotSupportedException:无效设置一个非虚拟(在VB重写)构件上:X => x.GetEvent ()' 当然,我也需要为IEventAggregator创建一个模拟,而不是EventAggregator,所以现在可以工作 –

测试需要改为:

[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(); 
}