单元测试委派操作被调用

本文关键字:调用 操作 委派 单元测试 | 更新日期: 2023-09-27 18:28:17

我有一个字典,我正在使用它来避免编写大型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)。

非常感谢。

单元测试委派操作被调用

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

MethodInfo methodToCall =
   decisionMapper[(int)ReviewStepType.StandardLetter].Method;
MethodInfo expectedMethod =
   typeof(CaseDecisionService).GetType().GetMethod("ProcessSendStandardLetter");
Assert.AreSame(expectedMethod, methodToCall);

我个人不会麻烦编写一个单元测试,它直接检查在每种情况下调用哪个操作。

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

感谢大家的帮助。这就是我最终所做的。

我模拟了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());