Вызывается действие делегата модульного теста - PullRequest
3 голосов
/ 20 марта 2012

У меня есть словарь, который я использую, чтобы не писать большие операторы 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)

Как я могу утверждать, что, когда я вызываю мой solutionMapper - это 1 равно вызову -caseDecisionService.ProcessSendStandardLetter (aCase).

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

Вы не можете сравнивать анонимных делегатов (см. эту ссылку). Вам нужно немного подумать, чтобы проверить свойство Method делегата Action. Он должен соответствовать MethodInfo метода caseDecisionService, который должен быть вызван. Например (Вы можете переписать, чтобы использовать функцию, чтобы сделать код короче):

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

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

Assert.AreSame(expectedMethod, methodToCall);
1 голос
/ 20 марта 2012

Спасибо всем за помощь в этом.Это было то, что я сделал в конце.

Я высмеял вызов службы действий, затем вызвал значение словаря, затем вызвал 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());
1 голос
/ 20 марта 2012

Лично я бы не стал писать модульный тест, который напрямую проверял, какое действие вызывается в каждом случае.

Если предположить, что этот словарь является частью более крупной системы, я бы написал один тест, который проходит через каждыйдействия словаря через любой класс содержит словарь.Я хочу проверить, что мой код дает мне ожидаемые результаты (например, результат вызова ProcessSendStandardLetter() или ProcessSendBespokeLetter());Меня меньше интересует проверка, как именно это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...