使用 unittest.mock 模拟枚举无法按预期工作
Mocking Enum using unittest.mock does not work as expected
我正在尝试模拟 Python 中的枚举,以便我可以断言 class 测试的方法是否调用了枚举上的方法。
这没有按预期工作。永远不会调用有问题的方法,因为模拟与实际枚举的身份比较总是失败。
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()
与其尝试创建枚举的模拟成员,不如 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
的调用。这解决了无法模拟身份的事实。
我正在尝试模拟 Python 中的枚举,以便我可以断言 class 测试的方法是否调用了枚举上的方法。
这没有按预期工作。永远不会调用有问题的方法,因为模拟与实际枚举的身份比较总是失败。
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()
与其尝试创建枚举的模拟成员,不如 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
的调用。这解决了无法模拟身份的事实。