【发布时间】:2011-01-17 00:19:33
【问题描述】:
我正在尝试为某些具有 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将数据保存到夹具时,不保存文件内容,仅将文件名保存到夹具中。虽然我发现这是预期的行为,因为文件内容没有保存到数据库中,但我想以某种方式将此信息包含在夹具中以进行测试。-
我有一个上传文件的测试用例,如下所示:
def test_post_solution_file(self): import tempfile import os filename = tempfile.mkstemp()[1] f = open(filename, 'w') f.write('These are the file contents') f.close() f = open(filename, 'r') post_data = {'file': f} response = self.client.post(self.solution.get_absolute_url()+'add_solution_file/', post_data, follow=True) f.close() os.remove(filename) self.assertTemplateUsed(response, 'tests/solution_detail.html') self.assertContains(response, os.path.basename(filename))
虽然此测试运行良好,但完成后会将上传的文件留在媒体目录中。当然,删除可以在tearDown()中处理,但我想知道Django是否有另一种处理方式。
我想到的一个解决方案是使用不同的媒体文件夹进行测试,该文件夹必须与测试夹具保持同步。运行测试时,有没有办法在settings.py 中指定另一个媒体目录?我可以在转储数据中加入某种挂钩,以便同步媒体文件夹中的文件吗?
那么,是否有更 Pythonic 或 Django 特定的方式来处理涉及文件的单元测试?
【问题讨论】:
-
所以 os.remove(foo) 不起作用?它会抛出异常吗?也许该目录/文件上没有正确的权限,无法从您的单元测试中删除它?
-
代码中的
os.remove()部分从临时目录中删除文件。为了删除上传的文件,我必须查看媒体目录并遵循更复杂的逻辑来找到文件的确切位置。我正在寻找一种更简单、更自动化的方法来实现它,如果它存在的话。 -
噢,对不起!我看错了你的帖子。如何在你的测试设置中破解 settings.MEDIA_ROOT = '/path/to/project/static/and/then/alternative/storage/' 和 settings.MEDIA_URL = '/static/and/then/alternative/storage/' ?哈克,但可以完成这项工作......
-
是否可以编写自定义存储实现并在测试期间替换它?看起来应该很容易编写一个只将上传的文件存储在内存中的实现。我不确定在测试期间如何替换它。
标签: python django unit-testing django-testing filefield