如何修复单元测试中的错误? |断言错误
How fix error in unit test? | AssertionError
我正在尝试将 unit-test
写入我在 Django 项目中的 create function
。这是我第一次创建单元测试。为什么我不能创建新数据?从错误中我了解到测试数据库中没有文章。我哪里做错了?
tests.py:
class ArticleViewTestCase(TestCase):
def setUp(self):
self.user = User.objects.create(
username='user',
email='user@gmail.com',
password='password'
)
self.client = Client()
def test_article_create(self):
self.assertTrue(self.user)
self.client.login(username='user', password='password')
response = self.client.get('/article/create/')
self.assertEquals(response.status_code, 200)
with open('/home/nurzhan/Downloads/planet.jpg', 'rb') as image:
imageStringIO = StringIO(image.read()) # <-- ERROR HERE
response = self.client.post(
'/article/create/',
content_type='multipart/form-data',
data={
'head': 'TEST',
'opt_head': 'TEST',
'body': 'TEST',
'location': 1,
'public': True,
'idx': 0,
'image': (imageStringIO, 'image.jpg')
},
follow=True
)
self.assertEqual(response.status_code, 200)
self.assertEqual(Article.objects.all().count(), 1)
错误:
Traceback (most recent call last):
File "/home/nurzhan/CA/article/tests.py", line 26, in test_article_create
imageStringIO = StringIO(image.read())
TypeError: 'module' object is not callable
进行单元测试时,Django 会在每次测试结束时清空数据库,因此每次测试都以一个空数据库开始。很可能在您的测试开始时没有用户存在,这意味着登录失败。您应该将测试更改为如下内容:
from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import User
class ArticleViewTestCase(TestCase):
def test_article_create(self):
User.objects.create(username='alice', password=make_password('topsecret'))
logged_in = self.client.login(username='alice', password="topsecret")
self.assertTrue(logged_in)
# Continue your test here
掌握了它之后,您最终会希望将用户创建移动到 setUp()
方法。
插入你的测试代码PDB测试工具:
# Below response = self.client.get('/article/create/')
import pdb;pdb.set_trace()
然后检查 response.data
那里会为您解答发生了什么:)
测试代码的一些提示:
如果您不需要检查用户登录数据,请使用
self.client.force_login(self.user)
您只需要提供用户对象及其清晰信息。
差异
你可以将 get 和 post 拆分为不同的测试方法,当你有很多 https 方法要测试时它很好,但它是可选的 - 只建议
尽量不要对数据库中的对象使用 len()
只需使用
Article.objects.all().count()
获取对象的数量
那么你不需要使用 len()
.
articles_amount = Article.objects.all().count()
self.assertEqual(articles_amount, 1)
您可以覆盖 form_invalid
并在您的测试中检查它的数据
class ArticleCreateView(CreateView):
# YOUR code here
def form_invalid(self, form):
data = {'status': False, 'errors': form.errors}
return JsonResponse(data, , status=500)
在测试方法中:
with open('/home/nurzhan/Downloads/planet.jpg', 'rb') as image:
response = self.client.post('/article/create/',
data={
'head': 'TEST',
'opt_head': 'TEST',
'body': 'TEST',
'location': 1,
'public': True,
'idx': 0,
'image': image
},
follow=True, format='multipart'
)
我正在尝试将 unit-test
写入我在 Django 项目中的 create function
。这是我第一次创建单元测试。为什么我不能创建新数据?从错误中我了解到测试数据库中没有文章。我哪里做错了?
tests.py:
class ArticleViewTestCase(TestCase):
def setUp(self):
self.user = User.objects.create(
username='user',
email='user@gmail.com',
password='password'
)
self.client = Client()
def test_article_create(self):
self.assertTrue(self.user)
self.client.login(username='user', password='password')
response = self.client.get('/article/create/')
self.assertEquals(response.status_code, 200)
with open('/home/nurzhan/Downloads/planet.jpg', 'rb') as image:
imageStringIO = StringIO(image.read()) # <-- ERROR HERE
response = self.client.post(
'/article/create/',
content_type='multipart/form-data',
data={
'head': 'TEST',
'opt_head': 'TEST',
'body': 'TEST',
'location': 1,
'public': True,
'idx': 0,
'image': (imageStringIO, 'image.jpg')
},
follow=True
)
self.assertEqual(response.status_code, 200)
self.assertEqual(Article.objects.all().count(), 1)
错误:
Traceback (most recent call last):
File "/home/nurzhan/CA/article/tests.py", line 26, in test_article_create
imageStringIO = StringIO(image.read())
TypeError: 'module' object is not callable
进行单元测试时,Django 会在每次测试结束时清空数据库,因此每次测试都以一个空数据库开始。很可能在您的测试开始时没有用户存在,这意味着登录失败。您应该将测试更改为如下内容:
from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import User
class ArticleViewTestCase(TestCase):
def test_article_create(self):
User.objects.create(username='alice', password=make_password('topsecret'))
logged_in = self.client.login(username='alice', password="topsecret")
self.assertTrue(logged_in)
# Continue your test here
掌握了它之后,您最终会希望将用户创建移动到 setUp()
方法。
插入你的测试代码PDB测试工具:
# Below response = self.client.get('/article/create/')
import pdb;pdb.set_trace()
然后检查 response.data
那里会为您解答发生了什么:)
测试代码的一些提示:
如果您不需要检查用户登录数据,请使用
self.client.force_login(self.user)
您只需要提供用户对象及其清晰信息。
差异
你可以将 get 和 post 拆分为不同的测试方法,当你有很多 https 方法要测试时它很好,但它是可选的 - 只建议
尽量不要对数据库中的对象使用 len()
只需使用
Article.objects.all().count()
获取对象的数量
那么你不需要使用 len()
.
articles_amount = Article.objects.all().count()
self.assertEqual(articles_amount, 1)
您可以覆盖 form_invalid
并在您的测试中检查它的数据
class ArticleCreateView(CreateView):
# YOUR code here
def form_invalid(self, form):
data = {'status': False, 'errors': form.errors}
return JsonResponse(data, , status=500)
在测试方法中:
with open('/home/nurzhan/Downloads/planet.jpg', 'rb') as image:
response = self.client.post('/article/create/',
data={
'head': 'TEST',
'opt_head': 'TEST',
'body': 'TEST',
'location': 1,
'public': True,
'idx': 0,
'image': image
},
follow=True, format='multipart'
)