在我的Django应用程序中,我有一段代码将文件上传到Amazon S3,我想在单元测试期间跳过本节。单元测试恰好与DEBUG=False
一起运行,因此我无法测试settings.DEBUG == True
以跳过此部分。有什么想法吗?
答案 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"
这允许您实际测试所有内容。