-1

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

这是代码: 在视图中:

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:我在课堂上没有我的方法,我不想改变它。

4

1 回答 1

1

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(). 您使用模拟能够专注于特定代码单元的行为,其中模拟可以让您精确控制与其他单元的交互。

换句话说,如果你有这样的代码:

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

那么在测试some_function_to_test()时打补丁是有意义的myfunction()

我建议您阅读 Python 名称的工作原理;我强烈推荐有关 Python 名称和值的事实和神话,以及文档中的修补位置。unittest.mock

于 2017-10-08T08:53:55.140 回答