我正在为一些有FileField的模型构建测试。模型如下:
class SolutionFile(models.Model):
'''
A file from a solution.
'''
solution = models.ForeignKey(Solution)
file = models.FileField(upload_to=make_solution_file_path)
我遇到了两个问题:
./manage.py dumpdata
将数据保存到夹具时,不保存文件内容,只将文件名保存到夹具中。虽然我发现这是预期的行为,因为文件内容没有保存到数据库中,但我希望在测试时将这些信息包含在夹具中。虽然此测试工作正常,但它在完成后将上传的文件留在媒体目录中。当然,删除可以在tearDown()
中处理,但我想知道Django是否有其他方法来处理这个问题。
我正在考虑的一个解决方案是使用不同的媒体文件夹进行测试,测试必须与测试装置同步。在运行测试时,有没有办法在settings.py
中指定另一个媒体目录?我是否可以将某种类型的钩子加入到dumpdata,以便它可以同步媒体文件夹中的文件?
那么,是否有一种更特定于Pythonic或Django的方法来处理涉及文件的单元测试?
发布于 2013-12-11 01:10:01
Django为在FileFields上编写测试提供了一种很好的方法,而无需在实际的文件系统中使用SimpleUploadedFile。
from django.core.files.uploadedfile import SimpleUploadedFile
my_model.file_field = SimpleUploadedFile('best_file_eva.txt', b'these are the contents of the txt file')
这是django的神奇特性之一--不出现在文档中:)然而,它被引用到这里。
发布于 2014-01-10 05:44:49
发布于 2010-02-15 22:14:23
我曾经为整个图库应用程序编写过单元测试,对我来说,最有效的方法是使用python文件和shutil模块在临时目录中创建测试文件的副本,然后将它们全部删除。
下面的示例没有工作/完成,但应该会使您走上正确的道路:
import os, shutil, tempfile
PATH_TEMP = tempfile.mkdtemp(dir=os.path.join(MY_PATH, 'temp'))
def make_objects():
filenames = os.listdir(TEST_FILES_DIR)
if not os.access(PATH_TEMP, os.F_OK):
os.makedirs(PATH_TEMP)
for filename in filenames:
name, extension = os.path.splitext(filename)
new = os.path.join(PATH_TEMP, filename)
shutil.copyfile(os.path.join(TEST_FILES_DIR, filename), new)
#Do something with the files/FileField here
def remove_objects():
shutil.rmtree(PATH_TEMP)
我在单元测试的setUp()和tearDown()方法中运行这些方法,它工作得很好!您有一个干净的文件副本来测试可重用和可预测的文件字段。
https://stackoverflow.com/questions/2266503
复制相似问题