调用单元测试委托操作

时间:2012-03-20 11:03:20

标签: c# c#-4.0 delegates nunit

我有一个字典,我用来避免编写大的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等于call -caseDecisionService.ProcessSendStandardLetter(aCase)。

非常感谢。

3 个答案:

答案 0 :(得分:2)

您无法比较匿名代表(请参阅this链接)。您必须使用一点反射来检查Method委托的Action属性。它必须匹配应调用的MethodInfo方法的caseDecisionService。例如(您可以重写以使用函数来缩短代码):

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

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

Assert.AreSame(expectedMethod, methodToCall);

答案 1 :(得分:1)

我个人不打算编写一个单元测试,直接检查在每种情况下调用哪个动作。

假设这个字典是一个更大的系统的一部分,我会编写一个测试,通过任何类包含字典来完成每个字典操作。我想检查一下我的代码给出了我期望的结果(例如调用ProcessSendStandardLetter()ProcessSendBespokeLetter()的结果);我不太关心它是如何做到的。

答案 2 :(得分: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());