Django图像上传测试错误:“该属性没有与之关联的文件”

时间:2017-09-18 01:34:22

标签: python django

我有一个用户个人资料应用,允许用户上传头像。我正在尝试测试图片上传但收到错误。以下是我的相关文件:

models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=100, blank=True)
    last_name = models.CharField(max_length=100, blank=True)
    avatar = models.ImageField(upload_to="media/", blank=True, null=True)

views.py

def userprofile(request):
    # some code omitted for brevity
    if form.is_valid():
        form.save()
        return HttpResponseRedirect(userprofile.get_absolute_url())

tests.py

class UserProfileTest(TestCase):
    def setUp(self):
        self.client = Client()

        self.user = User.objects.create_user(
            username='testuser',
            email='test@test.test',
            password='testpassword',
        )
        self.user.userprofile.first_name = 'John'
        self.user.userprofile.last_name = 'Doe'

    def test_image_upload(self):
        self.client.login(username='testuser', password='testpassword')
        with open('media/tests/up.png', 'rb') as image:
            self.client.post('/profile/', {'avatar': image})
        print(self.user.userprofile.avatar.url)

错误:

File "userprofile/tests.py", line 110, in test_image_upload
  print(self.user.userprofile.avatar.url)
ValueError: The 'avatar' attribute has no file associated with it.

在测试中,我打印了response.content,可以在模板中看到头像的URL。 'media/tests/up.png'文件位于服务器上,并且正在成功上载。我的目标是在测试结束时删除文件,因为每次运行测试时它都会上传。我打算通过获取文件路径来删除文件(当有重复时,Django会将随机字母数字字符附加到文件名的末尾),但我现在无法获取其文件路径。

1 个答案:

答案 0 :(得分:0)

您需要一个django文件对象进行测试。你可以创建一个python文件,然后有一个django ImageFile:

from django.core.files.images import ImageFile

with open('media/tests/up.png', 'rb') as image:
    test_file = ImageFile(image)

然后使用test_file进行测试。