2011-10-06 35 views
0

我正在努力編寫一個測試,以確認在關閉時正確取消訂閱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(); 
} 

回答

2

在這裏,我覈實了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方法,該方法返回您在測試中創建的標記。

0

你需要告訴你的EventAggregator模擬來回報您的嘲笑IssuerSelectedEvent

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

謝謝 - 我嘗試之前,得到了 'System.NotSupportedException:無效設置一個非虛擬(在VB重寫)構件上:X => x.GetEvent ()' 當然,我也需要爲IEventAggregator創建一個模擬,而不是EventAggregator,所以現在可以工作 –

0

測試需要改爲:

[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(); 
} 
相關問題