我正在为我创建的端点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
有人能帮我吗?谢谢
1条答案
按热度按时间nx7onnlm1#
该错误的原因是您在请求正文中发送的是“payload”而不是查询参数。
您正试图从request.GET获取文本,但该文本不存在,将返回None。
当你示例化你的序列化器时,当传递的数据将具有值None的key joke时,它将是无效的,并将引发异常,这将是一个validationError,即400 BAD请求。
您的函数将从此行返回。
因此,您的Assert将失败。400!= 201
要解决这个问题,请将joke作为查询参数而不是请求体发送。