我有一个用户个人资料应用,允许用户上传头像。我正在尝试测试图片上传但收到错误。以下是我的相关文件:
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会将随机字母数字字符附加到文件名的末尾),但我现在无法获取其文件路径。
答案 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进行测试。