Tôi đang cố gắng xây dựng các thử nghiệm cho một số mô hình có một FileField. Mô hình này trông như thế này:Kiểm tra Django FileField sử dụng đồ đạc thử nghiệm
class SolutionFile(models.Model):
'''
A file from a solution.
'''
solution = models.ForeignKey(Solution)
file = models.FileField(upload_to=make_solution_file_path)
tôi đã gặp phải hai vấn đề:
Khi lưu dữ liệu vào một vật cố sử dụng
./manage.py dumpdata
, nội dung tập tin sẽ không được lưu, chỉ có tên tập tin được lưu vào vật cố định. Trong khi tôi thấy điều này là hành vi mong đợi vì nội dung tệp không được lưu vào cơ sở dữ liệu, tôi muốn bằng cách nào đó bao gồm thông tin này trong lịch thi đấu để kiểm tra.Tôi có một trường hợp thử nghiệm để tải lên một tập tin đó trông như thế này:
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))
Trong khi thử nghiệm này chỉ hoạt động tốt, nó để lại các tập tin được tải lên trong thư mục phương tiện truyền thông sau khi kết thúc. Tất nhiên, việc xóa có thể được thực hiện trong tearDown()
, nhưng tôi đã tự hỏi nếu Django đã có một cách khác để đối phó với điều này.
Một giải pháp mà tôi đã nghĩ đến là sử dụng một thư mục phương tiện khác để kiểm tra phải được đồng bộ hóa với các thiết bị thử nghiệm. Có cách nào để chỉ định thư mục phương tiện khác trong settings.py
khi thử nghiệm đang được chạy không? Và tôi có thể bao gồm một số loại móc để dumpdata để nó đồng bộ các tập tin trong các thư mục phương tiện truyền thông?
Vì vậy, có cách nào khác về Pythonic hoặc Django cụ thể để xử lý các bài kiểm tra đơn vị liên quan đến tệp không?
Vì vậy os.remove (foo) làm việc does't? Nó có ném một ngoại lệ không? Có lẽ không có những người bảo mật chính xác trên thư mục/tệp đó để có thể xóa nó khỏi bên trong bài kiểm tra đơn vị của bạn? –
'os.remove() 'một phần trong đoạn mã sẽ xóa tệp khỏi thư mục tạm thời. Để xóa tệp đã tải lên, tôi phải tìm trong thư mục phương tiện và theo một logic phức tạp hơn để tìm vị trí chính xác của tệp. Tôi đang tìm một cách tự động, dễ dàng hơn để làm điều đó, nếu nó còn tồn tại. – sttwister
D'oh, xin lỗi! Tôi đã đọc sai bài đăng của bạn. Cài đặt hacking.MEDIA_ROOT = '/ path/to/project/static/và/then/alternative/storage /' và settings.MEDIA_URL = '/ static/và/then/alternative/storage /' trong thiết lập của bạn cho các bài kiểm tra của bạn ? Hacky, nhưng có thể thực hiện công việc ... –