Python Django测试因断言错误而失败:201=400
得到以下观点Python Django测试因断言错误而失败:201=400,python,django,django-rest-framework,django-tests,Python,Django,Django Rest Framework,Django Tests,得到以下观点 class MyUserCreate(APIView): ''' Creates the user. ''' def post(self, request, format='json'): serializer = MyUserSerializer(data=request.data) if serializer.is_valid(): user = serializer.save()
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
然后
因此,我创建了一个201而不是一个400错误请求。正如您在中看到的,没有您的本地数据库使用到期测试正在运行。所以,我猜,数据库表屏幕截图中的用户存在于您的本地数据库中。
运行测试时,Django会创建另一个数据库(仅用于当前测试)。在该数据库中,除了在
setUp
testclass方法或fixture中创建的用户之外,您没有任何用户testing
。最简单的修复方法是更改测试方法:
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)
另外,在获取
响应.数据的长度时要小心。如果您在某个地方对响应进行了分页,您将不会收到所有预期的实例(按页面大小最大)。当您说“数据库中存在用户测试”时,您的意思是数据存在于测试数据库中,还是项目正常使用的数据库中?测试数据库在测试之间应该是空的,除非您在其他地方设置fixture。我相信这里会有一个201。如果您第二次self.client.post()
,您应该会得到预期的400。您有一个条件断言只有一个用户self.assertEqual(MyUser.objects.count(),1)
@rob,因此在您看来,问题在于测试是如何设计的-它应该包括两个self.client.post()
。考虑到您还提到的另一件事,«测试数据库在测试之间应该是空的»(不知道您从何处提取练习?)。无论如何,在本例中,数据库实际上是空的,直到我创建了一个超级用户名“testing”,然后运行测试以查看它是否允许我创建具有相同名称的用户。确实如此……这样我就得到了断言错误:2!=1由于这一行:self.assertEqual(MyUser.objects.count(),1)
@TiagoMartinsPeres李大仁 您以前创建过用户吗?在夹具或设置中
方法?正确。我使用setUp方法在tests.py中创建了一个。因此,将该行中的数字编辑为2。
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)