Assert错误:400!= 201单元测试Django REST Framework with drf-yasg

gz5pxeao  于 2023-04-22  发布在  Go
关注(0)|答案(1)|浏览(118)

我正在为我创建的端点POST创建单元测试:
终点:

class AddJokeAPI(generics.ListAPIView):
    serializer_class = JokeSerializer
    queryset = Joke.objects.all()
    query_param = openapi.Parameter('text', openapi.IN_QUERY,
                             description="Nuevo chiste",
                             type=openapi.TYPE_STRING)

    @swagger_auto_schema(
        operation_description="Guarda en una base de datos el chiste el texto pasado por parámetro",
        manual_parameters=[query_param]
    )
    def post(self, request):
        serializer = self.get_serializer(data={"joke": self.request.GET.get('text')})
        serializer.is_valid(raise_exception=True)
        joke = serializer.save()
        return Response({
            "joke": JokeSerializer(joke, context=self.get_serializer_context()).data,
            "message": "New joke added",
            "success": True
        }, status=status.HTTP_201_CREATED)

如果你能看到,在POST方法中,我必须发送一个名为“text”的POST查询参数,以在模型“Joke”中注册它并接收201 HTTP Status。
这是我的test.py方法来调用该端点:

class JokesTestCase(TestCase):

    def setUp(self):
        self.client = APIClient()

    def test_post_joke(self):
        payload = {
            'text': 'Test Joke'
        }
        response = self.client.post('/api/jokes/add', payload)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

我得到的错误是:

self.assertEqual(response.status_code, status.HTTP_201_CREATED) AssertionError: 400 != 201

正如你所看到的错误是我正在提出一个错误的请求,但我不知道为什么我会得到这个错误。
如果我尝试使用此路径发出请求,测试将按照我的预期通过:

response = self.client.post('/api/jokes/add?text=Test%20Joke')

更新:这是我的serializers.py

class JokeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Joke
        fields = ('id', 'joke')

    def create(self, validated_data):
        joke = Joke.objects.create(**validated_data)
        return joke

有人能帮我吗?谢谢

nx7onnlm

nx7onnlm1#

该错误的原因是您在请求正文中发送的是“payload”而不是查询参数。

response = self.client.post('/api/jokes/add', payload)

您正试图从request.GET获取文本,但该文本不存在,将返回None。

serializer = self.get_serializer(data={"joke": self.request.GET.get('text')})

当你示例化你的序列化器时,当传递的数据将具有值None的key joke时,它将是无效的,并将引发异常,这将是一个validationError,即400 BAD请求。

serializer.is_valid(raise_exception=True)

您的函数将从此行返回。
因此,您的Assert将失败。400!= 201
要解决这个问题,请将joke作为查询参数而不是请求体发送。

response = self.client.post('/api/jokes/', params={'text': 'Test Joke'})

相关问题