2016-10-30 2 views
1

Я пытаюсь переделать перечисление в Python, чтобы я мог утверждать, вызывает ли метод класса проверенный метод на перечислении.Mocking Enum с помощью unittest.mock не работает должным образом

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

class ProcessorTest(unittest.TestCase): 
    def test_do_something(self): 
     # Mock library does not work with enums.. 
     self.mock_camera = mock.create_autospec(Camera.exit) 

     self.processor.process(self.mock_camera) 

     # => always leads to "failed" 
     self.assertTrue(self.mock_camera.do_something.called, 
         "Failed") 

class Camera(Enum): 
    entrance = 1 
    exit = 2 

    def do_something(self): 
     return True 

class Processor: 
    def process(self, camera): 
     # this comparison always resolves to false 
     if camera is Camera.exit: 
      # never reached 
      camera.do_something() 
+0

Вы пробовали исправить этот метод вместо того, чтобы заменить весь член перечислителя? Нельзя издеваться над личностью. – jonrsharpe

+0

@jonrsharpe спасибо, что сработало. Вид нового с тестированием на Python, но вы не можете издеваться над личностью. Это сработало: 'Camera.exit.do_something = mock.MagicMock()' и 'self.assertTrue (Camera.exit.do_something.called,« failed »)' – edwardmp

ответ

1

Вместо того, чтобы пытаться создать макет члена перечисления, просто patch that method:

from enum import Enum 
import unittest 


class Camera(Enum): 
    entrance = 1 
    exit = 2 

    def do_something(self): 
     return True 


class Processor: 

    def process(self, camera): 
     if camera is Camera.exit: 
      camera.do_something() 


class TestProcessor(unittest.TestCase): 

    def test_processor_process(self): 
     with unittest.mock.patch.object(Camera, 'do_something') as mock_method: 
      Processor().process(Camera.exit) 
      mock_method.assert_called_once_with() 


if __name__ == '__main__': 
    unittest.main() 

Теперь вы можете передать реальный член, но перехват вызовов на do_something. Это оборачивается тем фактом, что нет способа издеваться над личностью.

+0

Просто решил это самостоятельно, основываясь на вашем комментарии, но я буду с радостью принимаю ваш ответ – edwardmp

+0

@edwardmp, вы можете отправить свой собственный ответ, если вы сделали это по-другому. Обратите внимание, что лучше соответствовать вашему собственному примеру - что такое 'open_barrier'? – jonrsharpe

+0

Спасибо, отредактировал его. Мое решение отличается синтаксисом, но похоже. – edwardmp

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