单元测试委派操作被调用
本文关键字:调用 操作 委派 单元测试 | 更新日期: 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());