2012-03-20 33 views
3

我有一個字典,我正在使用,以避免寫大if語句。它將一個枚舉映射爲一個動作。它看起來像這樣:單元測試委託操作被稱爲

var decisionMapper = new Dictionary<int, Action> 
          { 
           { 
            (int) ReviewStepType.StandardLetter, 
            () => 
          caseDecisionService.ProcessSendStandardLetter(aCase) 
            }, 
           { 
            (int) ReviewStepType.LetterWithComment, 
            () => 
          caseDecisionService.ProcessSendStandardLetter(aCase) 
            }, 
           { 
            (int) ReviewStepType.BespokeLetter, 
            () =>    
          caseDecisionService.ProcessSendBespokeLetter(aCase) 

            }, 
           { 
            (int) ReviewStepType.AssignToCaseManager, 
            () => 
          caseDecisionService.ProcessContinueAsCase(aCase) 
            }, 
          }; 

那麼我這樣稱呼它在我的方法:

 decisionMapper[(int) reviewDecisionRequest.ReviewStepType](); 

我的問題是我怎麼能單元測試這些映射? (我使用NUnit和C#4.0)

我怎麼能斷言,當我打電話給我的decisionMapper - 即1等於呼叫-caseDecisionService.ProcessSendStandardLetter(aCase)。

非常感謝。

+0

ReviewStepType是什麼類型?枚舉?如果你可以Enum.GetValues()(然後將每一個轉換爲int)。 – 2012-03-20 11:07:27

+0

嗨,謝謝,是它的一個枚舉。這將如何與測試一起工作?我想知道我已經正確地完成了我的映射。 – Sean 2012-03-20 11:10:56

回答

1

感謝大家對此的幫助。這是我最終做的。

我嘲笑Action Service調用,然後調用字典的值,然後調用AssertWasCalled/AssertWasNotCalled。像這樣:

 mapper[(int) ReviewStepType.StandardLetter].Invoke(); 
     caseDecisionService.AssertWasCalled(c => c.ProcessSendStandardLetter(aCase), 
              options => options.IgnoreArguments()); 
     caseDecisionService.AssertWasNotCalled(c => 
               c.ProcessSendBespokeLetter(aCase), 
               options => options.IgnoreArguments()); 
     caseDecisionService.AssertWasNotCalled(c => 
               c.ProcessContinueAsCase(aCase), 
               options => options.IgnoreArguments()); 
2

您無法比較匿名代表(請參閱this鏈接)。您必須使用一點反思來檢查Action委託人的Method財產。它必須匹配應該調用的caseDecisionService方法的MethodInfo。例如(您可能改寫使用功能,使短碼):

MethodInfo methodToCall = 
    decisionMapper[(int)ReviewStepType.StandardLetter].Method; 

MethodInfo expectedMethod = 
    typeof(CaseDecisionService).GetType().GetMethod("ProcessSendStandardLetter"); 

Assert.AreSame(expectedMethod, methodToCall); 
+0

謝謝你。儘管「.Method」返回了映射器初始化的服務方法的methodinfo。不是特定的Action方法信息。所以此刻斷言總是假的 – Sean 2012-03-20 13:53:06

+1

感謝大家的幫助。最終我得到了這樣的工作。我嘲笑Action(caseDecisionService),在字典上調用Invoke,然後使用assertwascalled/assertwasnotcalled。像這樣: mapper [(int)ReviewStepType.StandardLetter] .Invoke(); caseDecisionService.AssertWasCalled(c => c.ProcessSendStandardLetter(aCase),options => options.IgnoreArguments()); caseDecisionService.AssertWasNotCalled(c => c.ProcessSendBespokeRpcLetter(aCase),options => options.IgnoreArguments()); – Sean 2012-03-20 14:56:17

+0

好主意,發貼爲答案! – 2012-03-20 16:21:31

1

我個人不會刻意編寫單元測試,直接檢查這些動作在每種情況下被調用。

假設這本詞典是一個更大的系統的一部分,我會寫一個測試,通過任何類別的字典行動包含字典。我想檢查我的代碼給我預期的結果(例如調用ProcessSendStandardLetter()ProcessSendBespokeLetter()的結果);我對檢查它究竟是如何做不太感興趣。