【发布时间】:2014-10-17 20:49:41
【问题描述】:
下面有一些代码,用于输入文件、打开和处理,然后输出一些数据。我已经使功能正常工作,现在正在对其进行单元测试,下面是代码示例。
def foo(dir):
path_to_search = join(dir, "/baz/foo")
if isdir(path_to_search):
#path exists so do stuff...
for fname in listdir(path_to_search):
do_stuff()
else:
print "path doesn't exist"
我已经能够创建一个过去不容易存在的测试,但正如您在上面看到的,我断言目录结构的“/baz/foo”部分存在(在生产中目录结构必须有这个文件,在某些情况下它不会,我们也不需要处理它。)
我尝试使用 TempDir 创建一个临时目录结构并加入,但代码总是显示路径不存在。
是否可以模拟 os.listdir 的输出,这样我就不需要创建一个遵循所需 /baz/foo 约定的临时目录结构?
【问题讨论】:
-
您可以为此使用 Labix Mocker 和
mocker.replace()。 -
@LukasGraf:最好使用 stdlib
unittest.mock或者它的后向端口mock。 -
@MartijnPieters 我个人更喜欢 Labix Mocker,主要是因为它们似乎是唯一正确修补的。见Where to Patch。 Labix 模拟程序通过实际收集对其修补的对象的引用来为您解决这个问题,并修补和重置这些对象,它就可以正常工作。
-
@LukasGraf:我实际上不喜欢这种魔法。我想控制修补了哪些代码,而不是让它神奇地应用它无处不在。
-
@MartijnPieters 在实际代码中,绝对是。在测试中,我欢迎任何让我的生活更轻松的事情。至于控制:如果像将
import a; a.SomeName更改为from a import SomeName这样的简单重构可以以微妙的方式破坏您的测试,那也是失控。
标签: python unit-testing