FileFieldを持ついくつかのモデルのテストを作成しようとしています。モデルは次のようになります。
class SolutionFile(models.Model):
'''
A file from a solution.
'''
solution = models.ForeignKey(Solution)
file = models.FileField(upload_to=make_solution_file_path)
私は2つの問題に遭遇しました:
を使用してフィクスチャにデータを保存する場合
./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にこれを処理する別の方法があるかどうか疑問に思いました。
私が考えていた解決策の1つは、テストフィクスチャとの同期を維持する必要があるテストに別のメディアフォルダーを使用することでした。settings.py
テストの実行中に別のメディアディレクトリを指定する方法はありますか?また、メディアフォルダ内のファイルを同期するために、dumpdataへのある種のフックを含めることはできますか?
それで、ファイルを含む単体テストを処理するためのよりPythonicまたはDjango固有の方法はありますか?