【问题标题】:Mocking Enum using unittest.mock does not work as expected使用 unittest.mock 模拟枚举不能按预期工作
【发布时间】:2016-10-30 21:26:00
【问题描述】:

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

【问题讨论】:

  • 您是否尝试过修补该方法,而不是替换整个枚举器成员?没有办法模拟身份。
  • @jonrsharpe 谢谢,那行得通。在 Python 中进行测试有点新,但实际上你不能模拟身份。这有效:Camera.exit.do_something = mock.MagicMock()self.assertTrue(Camera.exit.do_something.called, "failed")

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


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

【讨论】:

  • 根据您的评论我自己解决了,但我很乐意接受您的回答
  • @edwardmp 如果您的做法不同,欢迎您发布自己的答案。注意最好对应自己的例子——open_barrier是什么?
猜你喜欢
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多