Ошибка при тестировании представления с загрузкой файла - PullRequest
0 голосов
/ 25 января 2019

Я хотел бы проверить загрузку файла из моего представления с помощью следующей функции:

def test_post(self):
    with open("path/to/myfile/test_file.txt") as file:
        post_data = {
            'description': "Some important file",
            'file': file,
        }
        response = self.client.post(self.test_url, post_data)
        self.assertEqual(response.status_code, 302)

        document = Document.objects.first()
        self.assertEqual(document.description, "My File")
        self.assertEqual(document.filename, 'test_file.txt')

Когда я проверяю загрузку файла на реальном веб-сайте, это работает.Но когда я запускаю этот тест, я получаю следующую ошибку:

django.core.exceptions.SuspiciousFileOperation: Хранилище не может найти доступное имя файла для "WHJpMYuGGCMdSKFruieo / Documents / eWEjGvEojETTghSVCijsaCINTXKVYKFXVKWKWCWKWKWCWCWKWCWCWCWCWCWCFXVCFXVCFXVCFXVXVCFXVXVCVCFXVXVCFXVXVCFXVXVCFXVXVCFXVXVCFXVXVXVCVXVXVXVXVXVXVXVXVXVXVXVXVXVXTVTПожалуйста, убедитесь, что в соответствующем поле файла достаточно «max_length».

Вот моя форма save метод:

def save(self, commit=True):
    instance = super(DocumentForm, self).save(commit=False)
    instance.filename = self.cleaned_data['file'].name
    if commit:
        instance.save()  # error occurs here
    return instance

Видя, как это работает на реальном сайте,Я подозреваю, что это как-то связано с тем, как я настроил файл в тесте;возможно что-то маленькое.

1 Ответ

0 голосов
/ 25 января 2019

Ради краткости я удалил нерелевантные поля модели из моего первоначального вопроса. Но когда Ахтишам попросил посмотреть атрибут upload_to (который имел пользовательскую функцию), я удалил эти ненужные поля, и это сработало!

Итак, это мой оригинальный код (который не работал) с нерелевантными полями:

def documents_path(instance, filename):
    grant = instance.grant  
    client = grant.client
    return '{0}/Grant Documents/{1}/{2}'.format(client.folder_name, grant.name, filename)

....

file = models.FileField(upload_to=documents_path)

Но это работает:

def documents_path(instance, filename):
   return 'Documents/{0}'.format(filename)

Причина, по которой он работал на реальном веб-сайте, заключается в том, что он не использовал длинные символы из тестовых приборов. Похоже, те поля, которые я считал несущественными для вопроса, на самом деле были очень важны!

TL; DR Я уменьшил длину пользовательского пути к документу.

...