在Django中进行单元测试时,如何跳过一段代码?

时间:2009-09-21 17:49:54

标签: django unit-testing

在我的Django应用程序中,我有一段代码将文件上传到Amazon S3,我想在单元测试期间跳过本节。单元测试恰好与DEBUG=False一起运行,因此我无法测试settings.DEBUG == True以跳过此部分。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您真的不想在单元测试中“跳过”代码 - 如果您这样做,您将永远不会覆盖这些区域。为外部系统提供模拟接口要好得多,因此可以确保其余代码按预期运行。在处理可能不可用的外部资源时,这一点尤其重要,因为S3可能出现网络问题,服务中断或配置错误。

或者,您可以在生产环境中使用Django S3 storage backend,同时配置测试以使用本地文件存储。

答案 1 :(得分:1)

你可以 - 是的,这是一个黑客 - 导入执行上传的模块,并将该模块中的上传功能替换为另一个无效的功能。像这样:

foo.py:

def bar():
    return 42

biz.py:

import foo
print foo.bar() # prints 42
foo.bar = lambda: 37
print foo.bar() # prints 37

同样,这是一个黑客,但如果这是你将需要这样的功能的唯一地方,它可能适合你。

答案 2 :(得分:0)

您不会跳过测试功能。

您为不想运行的东西提供模拟实现。

首先,您通过将S3 Uploader设置为一个单独的类来设计测试,该类具有您的应用程序所需的API。

然后,您使用相同的API编写此类的模拟版本。所有这一切都是记录它被召唤。

最后,确保您的单元测试插入模拟对象而不是真正的S3 Uploader。

你的Django应用程序不应该进行任何更改 - 除了通过单元测试“注入”它的更改。

执行上传的views.py

import the_uploader
import mock_uploader
from django.conf import settings
uploadClass = eval( settings.S3_UPLOAD_CLASS_NAME )
uploader= uploadClass( ... )

现在,您提供了两个settings.py个文件。默认的settings.py具有正确的上传者类名。

为了进行测试,您的test_settings.py看起来像这样。

import settings.py
S3_UPLOAD_CLASS_NAME = "mock_uploader.mock_upload_class"

这允许您实际测试所有内容。