2017-08-15 40 views
1

我想單元測試一個方法調用,等待一個線程接收一個特定的值。線程每秒從一個接口輪詢幾次,當沒有信息時,它會收到一個默認的消息類型0.但是當線程接收到大於0的特定消息類型時,它會對它作出反應。我的情況是,具體的值打破了等待和方法返回結果。但是,我如何使用Moq進行設置?安裝Moq多次返回默認值,直到它應該返回一個特定的值

這個問題不是關於返回一個已知的序列,而是返回一個未知的連續序列,直到預期一個已知的值。

這是我走到這一步:

 mockedFacade.Setup(facade => facade.RequestPayment()).Callback(
      () => 
      { 
       CallbackMessageService.AddMessage(new CallbackMessage{Type = 2, Value = 1}); 
      }).Verifiable(); 
     mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage()); 

我建立一個測試系統,用於創建一個名爲CallbackMessageService消息。當Facade調用facade.GetCallbackMessage(第二個設置)時,它將默認返回一個類型爲0的消息。在測試過程中,我可以調用CallbackMessageService並通過CallbackMessageService.AddMessage(第一設置)向其添加消息。下次調用facade.GetCallbackMessage()時,系統將返回該特定消息。

CallbackMessageService可以工作,但問題是GetCallbackMessage(第二設置)的設置以某種方式緩存它從CallbackMessageService接收的第一條消息。然後它總是返回緩存的消息,而CallbackMessageService.GetNextMessage()永遠不會再被調用。我需要設置它,所以每當facade.GetCallbackMessage()時總是調用CallbackMessageService.GetNextMessage()。

我如何用Moq來完成?

我假設緩存是默認的事情,我知道關於SetupSequence。問題是我無法控制在返回特定值之前我必須處理多少個默認值。

我刪除了一些代碼來嘗試隔離問題。請讓我知道,如果有一點上下文。

+0

[不同的返回值第一次和第二次與Moq]可能的副本(https://stackoverflow.com/questions/7287540/different-return-values-the-first-and-second-time-with-moq ) – krillgar

+0

@krillgar我明白這看起來像是這類問題的重複,但這些問題總是知道他們確切的回報結構,而在我的情況下我不知道。在需要返回特定類型之前,我可以接收0給無限的默認類型。 – evilfish

回答

0

當我發佈這個問題後,我繼續修改代碼並找到了一個解決方案。此解決方案僅適用於我測試的系統在再次調用facade.GetCallbackMessage()之前調用另一個名爲facade.CallbackMessageProcessed的方法。我可以用這個來我的優勢,像這樣:

mockedFacade.Setup(facade => facade.RequestPayment()).Callback(
    () => 
    { 
     CallbackMessageService.AddMessage(new CallbackMessage{Type = 2, Value = 1, MessageID = Guid.NewGuid().ToString()}); 
    }).Verifiable(); 
mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage()); 
mockedFacade.Setup(facade => facade.CallbackMessageProcessed(It.IsAny<CallbackMessage>())).Callback(
    (CallbackMessage c) => 
    { 
     CallbackMessageService.MessageResolved(c); 
     mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage()); 
    }); 

每當CallbackMessageProcessed叫我創建了一個叫回來,我重新設置。這繼續循環,直到測試完成。所以這是解決這個問題的一種方法。

我也嘗試在我的facade.GetCallbackMessage()回調中進行設置,但那不起作用。

雖然這是對我的具體情況的答案,但如果在預期另一次退貨之前有一種方法可以在Moq中設置多個未知數量的退貨,如果您沒有第二次退貨像我一樣的方法。

+0

由於我沒有聽到任何新消息,我會關閉這個問題 – evilfish