使用 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 的调用。这解决了无法模拟身份的事实。