【问题标题】:How to verify the EventAggregator's unsubscribe method is called when disposing a ViewModel with Prism使用 Prism 处理 ViewModel 时如何验证 EventAggregator 的取消订阅方法被调用
【发布时间】:2011-10-06 14:10:43
【问题描述】:

我正在努力编写一个测试,以确认我在 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();
}

【问题讨论】:

    标签: wpf prism moq eventaggregator


    【解决方案1】:

    在这里,我正在验证 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 方法。

    【讨论】:

      【解决方案2】:

      你需要告诉你的EventAggregator模拟返回你模拟的IssuerSelectedEvent

      ea.Setup(x => x.GetEvent<IssuerSelectedEvent>()).Return(evnt.Object);
      

      【讨论】:

      • 谢谢 - 我之前试过了,得到了System.NotSupportedException : Invalid setup on a non-virtual (overridable in VB) member: x =&gt; x.GetEvent&lt;IssuerSelectedEvent&gt;() 当然,我还需要为 IEventAggregator 创建一个模拟,而不是 EventAggregator,这样现在可以工作了
      【解决方案3】:

      测试需要更改为:

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

      【讨论】:

        猜你喜欢
        • 2011-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多