使用unittest.mock模拟枚举不能按预期工作

时间:2016-10-30 21:26:00

标签: python python-unittest python-unittest.mock

我正在尝试在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()

1 个答案:

答案 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的呼叫。这解决了无法模仿身份的事实。