2

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

1 回答 1

2

与其尝试创建枚举的模拟成员,不如修补该方法

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. 这绕过了无法模拟身份的事实。

于 2016-10-30T21:48:06.710 回答