我是一个测试菜鸟,我试图弄清楚如何编写一个测试来确认模型表单有效并将生成 的新实例Post,这是一个具有图像字段的模型。
我查看了其他一些SO 帖子,看起来我应该使用 SimpleUploadedFile 来模拟图像字段。我很难理解 SimpleUploadedFile 的工作原理(尚未找到此应用程序的任何简单文档),并且不同的 SO 帖子使用一些不同的语法。
我是否应该指向 Django 应用程序中某处保存的实际图像的真实文件路径,或者这是否会创建一个要使用的假文件?
测试.py
class CreatePost(TestCase):
def test_create_post(self):
data = {
"content": "This is a post, I'm testing it out"
}
files_data = {
"image": SimpleUploadedFile(name='test_image.jpg', content=open(image_path, 'rb').read(), content_type='image/jpeg')
}
response = self.client.post("/new", data=data, files=files_data)
self.assertEqual(Post.objects.count(),1)
self.assertRedirects(response, 'index')
Run Code Online (Sandbox Code Playgroud)
模型.py
class Post(models.Model):
content = models.CharField(max_length=260)
timestamp = models.DateTimeField(auto_now_add=True)
posted_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="posts")
liked_by = models.ManyToManyField(User, blank=True, related_name="liked_posts")
image = models.ImageField(upload_to='uploads/', verbose_name='image')
def __str__(self):
return f"{self.posted_by} posted …Run Code Online (Sandbox Code Playgroud) 我正在使用 Django 1.7 和 Python 3.4 编写单元测试。当file_data元素被注释掉时,下面的表单验证正常。随着file_data包括它不验证和测试失败。
from django.core.files.uploadedfile import SimpleUploadedFile
...
data = {
'phone_number': '123456',
'job': Job.objects.latest('id').pk,
}
file_data = {
'portrait': SimpleUploadedFile(
content=b'',
content_type='image/jpeg',
name='test.jpg',
)
}
form = PersonForm(data, file_data)
self.assertTrue(form.is_valid())
Run Code Online (Sandbox Code Playgroud)
类似的代码适用FileField于我网站其他地方的上传测试。在 shell 中运行代码我得到以下内容form.errors:'Upload a valid image. The file you uploaded was either not an image or a corrupted image.'因此,我认为问题出在content或content_type字段中。我试过在这个答案中使用 image-as-a-string无济于事。[编辑:图像作为字符串的方法实际上是答案,但我一定是实施得很糟糕。接受的答案已验证有效。]我在SimpleUloadedFile 源代码中找不到任何线索。
该表单在现实中运行良好,但我想确保它包含在未来维护的工作测试中。理想情况下,我想避免必须存在实际test.jpg文件,因为图像在我的.gitignore …
我不明白如何管理表单和相关单元测试的更新,我真的很感激一些建议 =)
\n我有一个公司模型,以及相关的非常简单的 CompanyForm:
\nclass Company(models.Model):\n """\n Company informations\n - Detailed information for display purposes in the application\n but also used in documents built and sent by the application\n - Mail information to be able to send emails\n """\n company_name = models.CharField("nom", max_length=200)\n comp_slug = models.SlugField("slug")\n logo = models.ImageField(upload_to="img/", null=True, blank=True)\n use_groups = models.BooleanField("utilise les groupes", default=False) # Company uses groups or not\n rules = [("MAJ", "Majorit\xc3\xa9"), ("PROP", "Proportionnelle")] # Default management rule\n rule = models.CharField(\n "mode de …Run Code Online (Sandbox Code Playgroud)