Django test failing due to AssertionError:201 !=400
Django test failing due to AssertionError:201 !=400
得到以下观点
class MyUserCreate(APIView):
'''
Creates the user.
'''
def post(self, request, format='json'):
serializer = MyUserSerializer(data=request.data)
if serializer.is_valid():
user = serializer.save()
if user:
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
并想创建一个测试以确保我无法创建具有相同用户名的用户。
在serializers.py中,MyUserSerializer 中的用户名是这样的
username = serializers.CharField(
validators=[UniqueValidator(queryset=User.objects.all())],
max_length=32
)
并且在 models.py 中,用户名在 MyUser
username = models.CharField(db_column='username', unique=True, max_length=20)
在tests.py
class MyUserTest(APITestCase):
...
def test_create_user_with_preexisting_username(self):
data = {
'username': 'testing',
'password': 'test'
}
response = self.client.post(self.create_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(MyUser.objects.count(), 1)
self.assertEqual(len(response.data['username']), 1)
到目前为止,用户创建测试、没有用户名的用户、用户名太长的用户……都运行良好。这个问题只发生在这个特定的测试中。
数据库中存在用户测试
如果我运行
python manage.py tests
然后
FAIL: test_create_user_with_preexisting_username (codeLabsApp.tests.MyUserTest)
Ensure we can't create a user with preexisting username.
----------------------------------------------------------------------
Traceback (most recent call last):
...
AssertionError: 201 != 400
所以我得到的是 201 Created 而不是 400 Bad Request。
如您在 docs 中所见,没有您的本地数据库使用到期测试 运行。
所以,我想,数据库中的用户 table screenshot 存在于您的本地数据库中。
当您 运行 您的测试时,Django 会创建另一个数据库(仅用于当前测试)。在该数据库中,您没有用户 testing
,除了该用户是在 setUp
test-class 方法或 fixture.
中创建的
最简单的修复方法是更改测试方法:
def test_create_user_with_preexisting_username(self):
existed_username = "testing"
existed_user = MyUser.objects.create(username=existed_username)
data = {
'username': existed_username,
'password': 'test'
}
response = self.client.post(self.create_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(MyUser.objects.count(), 2)
self.assertEqual(len(response.data['username']), 1)
此外,当你得到 response.data
的长度时要小心。如果您在某个地方对响应进行了分页,您将不会收到所有预期的实例(页面大小的最大值)。
得到以下观点
class MyUserCreate(APIView):
'''
Creates the user.
'''
def post(self, request, format='json'):
serializer = MyUserSerializer(data=request.data)
if serializer.is_valid():
user = serializer.save()
if user:
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
并想创建一个测试以确保我无法创建具有相同用户名的用户。
在serializers.py中,MyUserSerializer 中的用户名是这样的
username = serializers.CharField(
validators=[UniqueValidator(queryset=User.objects.all())],
max_length=32
)
并且在 models.py 中,用户名在 MyUser
username = models.CharField(db_column='username', unique=True, max_length=20)
在tests.py
class MyUserTest(APITestCase):
...
def test_create_user_with_preexisting_username(self):
data = {
'username': 'testing',
'password': 'test'
}
response = self.client.post(self.create_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(MyUser.objects.count(), 1)
self.assertEqual(len(response.data['username']), 1)
到目前为止,用户创建测试、没有用户名的用户、用户名太长的用户……都运行良好。这个问题只发生在这个特定的测试中。
数据库中存在用户测试
如果我运行
python manage.py tests
然后
FAIL: test_create_user_with_preexisting_username (codeLabsApp.tests.MyUserTest)
Ensure we can't create a user with preexisting username.
----------------------------------------------------------------------
Traceback (most recent call last):
...
AssertionError: 201 != 400
所以我得到的是 201 Created 而不是 400 Bad Request。
如您在 docs 中所见,没有您的本地数据库使用到期测试 运行。
所以,我想,数据库中的用户 table screenshot 存在于您的本地数据库中。
当您 运行 您的测试时,Django 会创建另一个数据库(仅用于当前测试)。在该数据库中,您没有用户 testing
,除了该用户是在 setUp
test-class 方法或 fixture.
中创建的
最简单的修复方法是更改测试方法:
def test_create_user_with_preexisting_username(self):
existed_username = "testing"
existed_user = MyUser.objects.create(username=existed_username)
data = {
'username': existed_username,
'password': 'test'
}
response = self.client.post(self.create_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(MyUser.objects.count(), 2)
self.assertEqual(len(response.data['username']), 1)
此外,当你得到 response.data
的长度时要小心。如果您在某个地方对响应进行了分页,您将不会收到所有预期的实例(页面大小的最大值)。