2012-03-20 6 views
3

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

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

+0

Какой тип ReviewStepType? Enum? Если вы можете Enum.GetValues ​​() (а затем отбросить каждый из них до int). –

+0

привет спасибо, да его перечисление. как это будет работать с тестом? Я хочу знать, что правильно выполнил мои сопоставления. – Sean

ответ

1

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

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

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

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

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

Assert.AreSame(expectedMethod, methodToCall); 
+0

спасибо за это. Хотя «.Method» возвращает мне методinfo метода службы, в котором инициализируется карппер. Не конкретная информация о методе действий. Так что утверждение всегда ложно на данный момент – Sean

+1

Спасибо всем за помощь. В конце концов, я начал работать так. Я высмеивал действие (caseDecisionService), называемое Invoke в словаре, а затем использовал assertwascalled/assertwasnotcalled. Пример: mapper [(int) ReviewStepType.StandardLetter] .Invoke(); caseDecisionService.AssertWasCalled (c => c.ProcessSendStandardLetter (aCase), options => options.IgnoreArguments()); caseDecisionService.AssertWasNotCalled (c => c.ProcessSendBespokeRpcLetter (aCase), options => options.IgnoreArguments()); – Sean

+0

Хорошая идея, опубликуйте это как ответ! –

1

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

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

Смежные вопросы