2014-01-08 5 views
8

У меня есть следующий метод, который необходимо проверить с помощью Moq. Проблема в том, что каждый метод, вызываемый в операторе switch, является закрытым, в том числе PublishMessage в конце. Но этот метод (ProcessMessage) является общедоступным. Как я могу проверить это, чтобы я мог гарантировать, что вызовы выполняются в зависимости от параметра? Обратите внимание, что я не тестирую частные методы, я просто хочу проверить «вызовы». Я хотел бы высмеять эти частные методы и проверить, вызваны ли они с помощью программы установки, но Moq не поддерживает насмешливые частные методы.Тестирование вызовов частным методам с помощью moq

public void ProcessMessage(DispenserMessageDataContract dispenserMessage) 
    { 
     var transOptions = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }; 
     using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, transOptions)) 
     { 
      switch (dispenserMessage.Type) 
      { 
       case DispenserMessageType.AckNack: 
        UpdateAckNackMessageQueue(dispenserMessage); 
        break; 

       case DispenserMessageType.FillRequest: 
        CreateFillRequestMessageQueue(dispenserMessage); 
        break; 

       case DispenserMessageType.FillEvent: 
        UpdateFillEventMessageQueue(dispenserMessage); 
        break; 

       case DispenserMessageType.RequestInventory: 
        CreateRequestInventoryMessageQueue(dispenserMessage); 
        break; 

       case DispenserMessageType.ReceiveInventory: 
        CreateReceiveInventoryMessageQueue(dispenserMessage); 
        break; 
      } 

      scope.Complete(); 
     } 

     PublishMessage(dispenserMessage); 
    } 

ответ

2

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

9

Вам придется изменить те частные методы, чтобы по крайней мере защищать виртуальные, чтобы имитировать их, а затем использовать mock.Protected to mock them (http://blogs.clariusconsulting.net/kzu/mocking-protected-members-with-moq/). Вы не можете издеваться над частными методами.

Moq (и несколько других фреймворков) использует DynamicProxy Castle Project для генерации прокси на лету во время выполнения, так что члены объекта могут быть перехвачены без изменения кода класса. Этот перехват может быть выполнен только для виртуальных виртуальных и виртуальных методов.

Ниже URL для получения дополнительной информации: http://www.castleproject.org/projects/dynamicproxy/

+5

Моя команда решила заставить меня изменить личные методы защиты. Затем я создал оболочку для тестирования класса. Единственное, что меня беспокоит, это то, что Moq (или любая насмешливая структура) заставляет меня отклоняться от лучших практик. Я считаю, что частные методы должны оставаться закрытыми. – Ray

+2

Moq не заставляет отклоняться от лучших практик, что фактически отклоняется, так это то, что вы хотите самостоятельно проверять частные методы. В идеале тест не должен даже знать, что частные методы даже существуют. Вместо этого вы проверяете все взаимодействие, вызванное публичным методом, который вы вызываете напрямую, и все личные вещи, которые он вызывает впоследствии, то есть то, что видит вызывающий, а не детали реализации. – Alejandro

1

Moq для насмешливого свойства и методы, объявленных в интерфейсах и или абстрактные свойства и методы классов.

Идея тестирования Moq заключается в том, что вы проверяете взаимодействие между вашим классом и тестированием и остальным миром (его зависимостями). Moq делает это, создавая «смешную» реализацию интерфейса или производную абстрактного класса с реализованными абстрактными методами.

Moq не может переопределить существующую реализацию, как ваши частные методы. Это не работает Moq.

Либо вы должны протестировать «ProcessMessage» со всеми возможными входными и ожидаемыми результатами, либо вы должны реорганизовать свой класс, чтобы делегировать вызовы методам интерфейса, которые вы можете высмеять с помощью Moq. Тестирование частных методов - это плохая концепция. Они остаются конфиденциальными по какой-то причине, что должно скрывать реализацию, чтобы она могла измениться по своему усмотрению.

0

Я предпочитаю добавлять дополнительный класс (* Помощник) и переходить ко всем моим личным методам в общедоступные. Затем вы можете легко протестировать свои методы напрямую. Я не нашел более элегантного способа сделать это.

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