use*_*151 5 django unit-testing django-models django-testing
我是一个测试菜鸟,我试图弄清楚如何编写一个测试来确认模型表单有效并将生成 的新实例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 {self.content} at {self.timestamp}"
def is_valid_post(self):
return len(self.content) <= 260 and len(self.content) >= 0
class Post_form(ModelForm):
class Meta:
model = Post
fields = ['content', 'image']
Run Code Online (Sandbox Code Playgroud)
\n\n我很难理解 SimpleUploadedFile 的工作原理(尚未找到此应用程序的任何简单文档)
\n
看一下\xe2\x80\x94的源代码SimpleUploadedFile,它是一个文件的简单表示,只有内容、大小和名称。
您不需要指向真实图像的真实文件(除非您愿意)。因此,您可以用open(image_path, \'rb\').read()假数据甚至空的二进制数据替换真实图像(在您的示例中 \xe2\x80\x94 )b\'\'
还将所有请求字段放在单个数据对象下。
\n我在你的例子中没有找到初始化client。
总结一下,您的测试最终将如下所示:
\nfrom django.test import Client, TestCase\n\nclass CreatePost(TestCase):\n def setUp(self):\n self.client = Client()\n\n def test_create_post(self):\n data = {\n "content": "This is a post, I\'m testing it out",\n "image": SimpleUploadedFile(name=\'test_image.jpg\', content=b\'\', content_type=\'image/jpeg\')\n }\n response = self.client.post("/new", data=data)\n\n self.assertEqual(Post.objects.count(),1)\n self.assertRedirects(response, \'index\')\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
3954 次 |
| 最近记录: |