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

时间:2017-10-08 08:45:04

标签: python unit-testing mocking magicmock

我第一次写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:我不会在课堂上使用我的方法而且我不想改变它。

1 个答案:

答案 0 :(得分: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名称的工作原理;我强烈推荐Facts and myths about Python names and values以及unittest.mock文档中的Where to patch