如何模拟导入的库方法unittest.mock在Python3.5中?

2024-03-28 22:04:43 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以用unittest.mock在Python3.5中?在

# file my_function.py
import os
my_function():
    # do something with os, e.g call os.listdir
    return os.listdir(os.getcwd())

# file test_my_function.py
test_my_function():
    os = MagickMock()
    os.listdir = MagickMock(side_effect=["a", "b"])
    self.assertEqual("a", my_function())

我以为操作系统列表目录方法在第一次调用时返回指定的副作用“a”,但在我的函数内部未修补操作系统列表目录被称为。在


Tags: pytestimport目录列表osmyfunction
1条回答
网友
1楼 · 发布于 2024-03-28 22:04:43

^{}有两个主要职责:

  • DefineMockobjects:设计用于跟踪您的剧本并记录对模拟对象的每次访问的对象
  • 修补引用并恢复原始状态

在您的例子中,您需要这两个功能:修补生产代码中由mock使用的os.listdir引用,您可以完全控制它将响应。使用^{}的方法有很多种,details to take care on how use it和{a4}。在

在您的例子中,您需要测试my_function()行为,并且需要同时修补os.listdir()和{}。此外,您需要的是控制return_value(请参阅针对return_valueside_effect差异的文档)。在

我稍微改写了一下你的例子,使其更加完整和清晰:

^{1}$

我使用decorator语法是因为我认为这是一种更简洁的方法;此外,为了避免引入太多的细节,我没有使用autospecing 我认为这是一个非常好的做法。在

最后一点:mocking是一个强大的工具,但是使用它而不是滥用它,补丁只是你需要修补而不是更多。在

相关问题 更多 >