首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用测试夹具测试Django测试FileField

使用测试夹具测试Django测试FileField
EN

Stack Overflow用户
提问于 2010-02-15 14:23:06
回答 5查看 7.5K关注 0票数 30

我正在为一些有FileField的模型构建测试。模型如下:

代码语言:javascript
运行
复制
class SolutionFile(models.Model):
    '''
    A file from a solution.
    '''
    solution = models.ForeignKey(Solution)
    file = models.FileField(upload_to=make_solution_file_path)

我遇到了两个问题:

  1. 使用./manage.py dumpdata将数据保存到夹具时,不保存文件内容,只将文件名保存到夹具中。虽然我发现这是预期的行为,因为文件内容没有保存到数据库中,但我希望在测试时将这些信息包含在夹具中。
  2. 我有一个上传文件的测试用例,如下所示: def test_post_solution_file(self):导入tempfile os filename =tempfile.mkstemp()1f= open(filename,'w') f.write(‘这些是文件内容’) f.close() f= open(filename,'r') post_data = {' file ':f} post_data= post_data,( follow=True) f.close() os.remove(文件名) self.assertTemplateUsed(response,‘test/Solution.html’)self.assertContains(响应,os.path.basename(文件名))

虽然此测试工作正常,但它在完成后将上传的文件留在媒体目录中。当然,删除可以在tearDown()中处理,但我想知道Django是否有其他方法来处理这个问题。

我正在考虑的一个解决方案是使用不同的媒体文件夹进行测试,测试必须与测试装置同步。在运行测试时,有没有办法在settings.py中指定另一个媒体目录?我是否可以将某种类型的钩子加入到dumpdata,以便它可以同步媒体文件夹中的文件?

那么,是否有一种更特定于Pythonic或Django的方法来处理涉及文件的单元测试?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-12-11 01:10:01

Django为在FileFields上编写测试提供了一种很好的方法,而无需在实际的文件系统中使用SimpleUploadedFile。

代码语言:javascript
运行
复制
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的神奇特性之一--不出现在文档中:)然而,它被引用到这里

票数 31
EN

Stack Overflow用户

发布于 2014-01-10 05:44:49

可以使用MEDIA_ROOT装饰器如文件所示重写测试的如文件所示设置。

代码语言:javascript
运行
复制
from django.test import override_settings


@override_settings(MEDIA_ROOT='/tmp/django_test')
def test_post_solution_file(self):
  # your code here
票数 5
EN

Stack Overflow用户

发布于 2010-02-15 22:14:23

我曾经为整个图库应用程序编写过单元测试,对我来说,最有效的方法是使用python文件和shutil模块在临时目录中创建测试文件的副本,然后将它们全部删除。

下面的示例没有工作/完成,但应该会使您走上正确的道路:

代码语言:javascript
运行
复制
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()方法中运行这些方法,它工作得很好!您有一个干净的文件副本来测试可重用和可预测的文件字段。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2266503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档