首页 > 解决方案 > 由于 AssertionError:201 !=400 导致 Django 测试失败

问题描述

得到以下视图

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)

在测试.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。

标签: pythondjangodjango-rest-frameworkdjango-tests

解决方案


正如您在文档中看到的那样,由于测试运行,您的本地数据库没有使用。
所以,我猜,数据库表截图中的用户存在于您的本地数据库中。
当您运行测试时,Django 会创建另一个数据库(仅用于当前测试)。testing在该数据库中,除了该用户是在setUp测试类方法或夹具中创建的之外,您没有其他用户。
最简单的修复方法是更改​​测试方法:

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。如果您在某处有分页响应,您将不会收到所有预期的实例(最大页面大小)。


推荐阅读