Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django测试因断言错误而失败:201=400_Python_Django_Django Rest Framework_Django Tests - Fatal编程技术网

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)