Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pythonmock-如何像返回普通方法一样返回MagicMock_Python_Unit Testing_Mocking_Python Unittest_Python Mock - Fatal编程技术网

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

pythonmock-如何像返回普通方法一样返回MagicMock,python,unit-testing,mocking,python-unittest,python-mock,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.assertEqu

例如:

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对象来获取测试的返回,这个测试应该是一个包含3个元素的元组,并且不多或少

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

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

模拟用于测试代码之外的任何;如果
foo
调用了另一个外部函数
some\u module.bar()
,那么您将模拟
some\u 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\u bar.return\u value
设置为调用mocked
some\u module.bar()
函数时应该返回的值。当被测代码实际调用
bar()
时,模拟将返回该值


如果不设置
return\u值
将返回一个新的
MagicMock()
对象,该对象将支持进一步的调用,并且您可以像在
mock\u条
对象等上一样测试这些调用。

您是否尝试测试
MyClass.foo()
是否正常工作?因为你不应该嘲笑它。这个问题的想法是知道如何获得测试的返回,而不是MagicMock对象,因为我会在不同的场景中应用它。有些测试表明,我需要的是返回的值,而不是MagicMock对象;模拟其他内容但设置返回值的示例。如果您真的想模拟
MyClass.foo()
,那么您的示例过于冗长(并且不正确,在
def TestMyClass()
上没有
self
)。在任何情况下,您都直接调用mock,而原始的
MyClass.foo()
从未被调用,因为它已被mock替换。不需要显式调用类,甚至不需要实例化它。模拟图书馆让一切变得神奇。不知何故,按照上面的示例代码,在运行测试之后,foo_mock将只被称为
。我将根据您的答案尝试一些东西。自愿的,我会对发生的事情给出反馈。谢谢这里到底在测试什么?您有一个mock方法,您知道它返回什么
MyClass.foo()
还将所有内容传递给
某个模块.bar()
。那么在什么情况下这可能会失败呢?你在测试什么?@norbertpy,这里
MyClass.foo
方法是单元测试的。如果在
MyClass.foo
方法中执行了一些不正确的操作,例如,
plus
操作与
乘法
错误放置,则此测试将失败。