Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 测试图像上传总是失败_Django_Selenium_Django Unittest - Fatal编程技术网

Django 测试图像上传总是失败

Django 测试图像上传总是失败,django,selenium,django-unittest,Django,Selenium,Django Unittest,我无法让任何图像上传单元测试正常工作。以下测试因断言错误而失败:!='test_image.jpg'(忽略这样一个事实,即我的测试无论如何都会失败,因为它将ImageFieldFile与我的字符串进行比较,更重要的是,该图像不会更新。我稍后将修复该断言) 然而,类似的测试通过了 def test_info_update_works(self): user = User.objects.create(username='username', email='user@example.com'

我无法让任何图像上传单元测试正常工作。以下测试因断言错误而失败:!='test_image.jpg'(忽略这样一个事实,即我的测试无论如何都会失败,因为它将ImageFieldFile与我的字符串进行比较,更重要的是,该图像不会更新。我稍后将修复该断言)

然而,类似的测试通过了

def test_info_update_works(self):
    user = User.objects.create(username='username', email='user@example.com')
    self.client.force_login(user)

    self.client.post(reverse('update_profile', args=('username',)), {
        'email': 'updated@example.com'
    })
    user.refresh_from_db()

    self.assertEqual(user.email, 'updated@example.com')
编辑:

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='profile_pics/default.jpg', upload_to='profile_pics')

谢谢。

user.profile.image
'类型是ImageFieldFile而不是str。因此您无法比较它们

正确的方法应该是:

self.assertEqual(user.profile.image.name, 'profile_pics/default_test.jpg')

这就是我编写测试的方式,这样当测试失败时,您就不必调试测试了:

导入操作系统
def测试\上传\图像\工作(自):
user=user.objects.create(username='testuser',email='0)user@example.com')
self.client.force_登录(用户)
self.assertTrue(user.is\u经过身份验证)
#这应该是您为检查用户
#他有一个角色。
self.assertTrue(user.wears_hat('registered_user'))
#避免将文件上载到文件本身,并在文件的子目录中使用图像
#测试。这还允许它位于存储库中,以便CI管道和
#同事们不需要特别的步骤。
test_dir=os.path.join(os.path.dirname(_文件,'data'))
test\u img\u path=os.path.join(test\u dir,“default\u test.jpg”)
预期的_path=os.path.join(settings.MEDIA_ROOT,'profile_pics','default_test.jpg')
self.assertTrue(os.path.exists(test\u img\u path))
以开放(测试路径“rb”)作为填充:
r=self.client.post(
反向('update_profile',args=('testuser',),
content\u type='multipart/form data',
数据={'image':infle},
follow=True
)
self.assertTrue(r.ok)
user.refresh_from_db()
self.assertEqual(user.profile.image.path,预期路径)

谢谢,这帮助我解决了下一个问题,但是我真正的问题是图像没有更新,图像是
default.jpg
并且在测试后不会更新为
test\u image.jpg
当您尝试手动操作时,您的端点工作了吗?你能分享你的观点吗?手动操作很好。事实上,我已经被困在这个问题上好几个月了。我反复投入几个小时,一无所获,然后放弃,几周后回来。我添加了我的视图.py。谢谢。我找不到错误。可能是关于文件路径的。使用
os.path.join(MEDIA_ROOT,'profile_pics','test_image.jpg')
将比串联字符串更好。是的,这确实让我困惑了好几个月。我会尝试你对文件路径的建议,但是如果我更改它,那么它是错误的(例如,
tet\u img
),它会抛出一个错误,所以我认为不是这样。谢谢,尽管
数据:{'image':infle.read()}
谢谢,但是这仍然返回相同的失败:s。我在上面编辑了我的代码,很抱歉太晚了。你的方法应该行得通,让我详细看看。好的,所以您没有测试
response.OK()
,这意味着您可能被拒绝了。新创建的用户是否自动分配了“注册用户”角色?非常感谢。这是非常有帮助的,因为这里有很多我可以学习的东西。我的当前用户是“注册用户”。原来我在同一页面上的另一个测试(对于电子邮件)返回状态代码302,而这个测试仍然失败,错误为400。我的代码中一定有导致错误的其他地方。明天我会彻底检查一遍。再次感谢
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='profile_pics/default.jpg', upload_to='profile_pics')
self.assertEqual(user.profile.image.name, 'profile_pics/default_test.jpg')