蟒蛇魔术模拟不设置模拟值



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

您在测试模块中具有对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文档中的补丁位置

相关内容

  • 没有找到相关文章

最新更新