我有一个字典,我用来避免编写大的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)。
非常感谢。
答案 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());