Python 魔法模拟没有设置模拟值

Python magic mock not setting the mocked value

我是第一次写 python 测试。我正在尝试测试一个基本的模拟。我想 return 一些我在调用函数时想要的值,而不是模拟对象。

代码如下: 在观看次数中:

def myfunction():
    return "Actual data"

测试中:

class TestBasic(unittest.TestCase):
    @patch('trailblazer.views.myfunction')
    def testMyFunction(self, val):
        print(val)
        val.return_value = "Test value"
        print(val)
        op = myfunction()
        print(op)

输出:

<MagicMock name='myfunction' id='4520521120'>
<MagicMock name='myfunction' id='4520521120'>
Actual data
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

PS:class 中没有我的方法,我不想更改它。

您在测试模块中有对 myfunction() 的直接引用,并且 该引用 从未被修补。您只修补了 trailblazer.views 模块中的引用。

如果您使用该参考而不是 myfunction:

,您的测试将会成功
from trailblazer import views

class TestBasic(unittest.TestCase):
    @patch('trailblazer.views.myfunction')
    def testMyFunction(self, val):
        print(val)
        val.return_value = "Test value"
        print(val)
        op = views.myfunction()
        print(op)

然而,更有意义的测试是测试使用myfunction()的代码。您使用 mocking 可以专注于特定代码单元的行为,mocking 可以让您精确控制与 other 单元的交互。

换句话说,如果您有如下代码:

def some_function_to_test():
    # other things
    result = myfunction()
    # more things working on result
    return final_result

然后 在测试 some_function_to_test() 时修补 myfunction().

是有意义的

我建议您阅读 Python 名称的工作原理;我强烈推荐 unittest.mock 文档中的 Facts and myths about Python names and values, together with Where to patch