我正在尝试在Python中模拟枚举,以便我可以断言所测试类的方法是否在枚举上调用方法。
这不能按预期工作。有问题的方法永远不会被调用,因为模拟与实际枚举的身份比较总是失败。
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 :(得分: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
的呼叫。这解决了无法模仿身份的事实。