我正在尝试为某些具有 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 特定的方式来处理涉及文件的单元测试?