2012-03-20 18 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のを使用しています#4.0 C)

どのように私は私のdecisionMapper呼び出すときと主張することができます - 1は、コール-caseDecisionService.ProcessSendStandardLetter(aCase)に等しいこと。

ありがとうございました。

+0

どのようなタイプがReviewStepTypeですか?列挙? Enum.GetValues()を実行できる場合は(それぞれをintにキャストします)。 –

+0

こんにちは、ありがとう、はいその列挙型。それはどのようにテストで動作しますか?私は正しく私のマッピングを完了したことを知りたい。これのために – Sean

答えて

1

ありがとうございました。これは私が最後にやったことでした。

私はアクションサービスの呼び出しを嘲笑し、辞書の値を呼び出してから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

+1

助けてくれてありがとう。私はこのように最後に働いています。私はアクション(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

+0

良いアイデア、答えとして投稿してください! –

1

は、私は個人的に直接、それぞれの場合に呼び出されるアクションチェックするユニットテストを書く気にしないでしょう。

この辞書が大規模なシステムの一部であると仮定すると、辞書の各動作を、には辞書を含む何らかのクラスを介して実行する1つのテストを作成します。私のコードが私に期待している結果を与えるかどうかチェックしたい(例えば、ProcessSendStandardLetter()またはProcessSendBespokeLetter()を呼び出した結果)。私はあまり正確にそれがどうしているかを調べることにはあまり興味がない。

関連する問題