Python Mock - 如何像普通方法一样返回 MagicMock

标签 python unit-testing mocking python-unittest python-mock

例如:

import mock

class MyClass(object):
    def foo(self, x, y, z):
        return (x, y, z)


class TestMyClass(TestCase)
    @mock.patch('MyClass')
    def TestMyClass(self, MyClassMock):
        foo_mock = MyClassMock.foo()

        self.assertEquals((x, y, z), foo_mock)

因此,真正的问题是:如何获得该测试的返回值而不是获得此 <MagicMock name='MyClass.foo()' id='191728464'>或者如何处理这个 MagicMock 对象以获得该测试的返回值,该测试应该是一个包含 3 个元素的元组,不多也不少?

任何建议、任何想法、任何争论都将受到欢迎。 提前致谢!

最佳答案

如果您尝试测试 MyClass.foo() 是否正常工作,您不应该模拟它。

模拟用于被测代码之外的任何事物;如果 foo 调用了另一个外部函数 some_module.bar(),那么您将模拟 some_module.bar() 并给它分阶段返回值:

import some_module

class MyClass(object):
    def foo(self, x, y, z):
        result = some_module.bar(x, y, z)
        return result[0] + 2, result[1] * 2, result[2] - 2

class TestMyClass(TestCase):
    @mock.patch('some_module.bar')
    def test_myclass(self, mocked_bar):
        mocked_bar.return_value = (10, 20, 30)

        mc = MyClass()

        # calling MyClass.foo returns a result based on bar()
        self.assertEquals(mc.foo('spam', 'ham', 'eggs'),
            (12, 40, 28))
        # some_class.bar() was called with the original arguments
        mocked_bar.assert_called_with('spam', 'ham', 'eggs')

在这里,我将 mocked_bar.return_value 设置为调用模拟的 some_module.bar() 函数时应返回的值。当被测代码实际调用 bar() 时,模拟会返回该值。

当您不设置return_value 时,将返回一个 MagicMock() 对象,该对象将支持进一步的调用,您可以像在 mocked_bar 对象上一样测试这些调用,等等。

关于Python Mock - 如何像普通方法一样返回 MagicMock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21611595/

相关文章:

javascript - 如何模拟在另一个导入中导入的方法

rest - 如何模拟 REST API

c# - 这个最小起订量代码在 RhinoMocks 中会是什么样子

python - 加载 spacy 时出错 - 'en_core_web_sm' 库

python - 提取检测到的对象并保存到不同的图像 - OpenCV Python

java - 使用服务层模拟创建 Controller 测试,该测试将运行实际容器(例如 tomcat,可能会更改 spring 上下文文件)

python django 模拟缓存

python - x tan(x) - b 的零点

python - 如何将 numpy 数组列表加载到 pytorch 数据集加载器?

unit-testing - 闭包内的 mock 模拟方法