Тестирование Django REST Framework: Как передать параметры в POST-запрос. Получение ошибки 400 вместо 201 - PullRequest
0 голосов
/ 21 ноября 2019

Статьи создаются админом. Аутентифицированный пользователь имеет право читать их и нравится им или не нравится им. Мне нужно проверить вид.

Модель:

class Like(models.Model):
    reader = models.ForeignKey(User, on_delete = models.CASCADE)
    article = models.ForeignKey(Article, on_delete = models.CASCADE)

Представление выглядит следующим образом (пользователь не должен передавать никаких параметров - ему «нравится» статья, и на основе его идентификатора создается новый реестр. идентификатор статьи):

class LikeCreate(generics.CreateAPIView):
    queryset = Like.objects.all()
    serializer_class = LikeSerializer

Тестовый класс:

class TestLikeViews(APITestCase):
    def setUp(self):
        self.factory = APIRequestFactory()
        self.user = User.objects.create_user(
            username='Name', email='test@company.com', password='top_secret')  
        self.article = Article.objects.create(
            author='X', title='Title', body='Body content...')
        self.like = Like.objects.create(
            reader=self.user, article=self.article)

    def test_like_post_user(self):
        request = self.factory.post('likes/', kwargs={'reader': self.user, 'article': self.article}) 
        request.user = self.user 
        response = LikeCreate.as_view()(request, reader=self.user, article=self.article)
        self.assertEqual(response.status_code, 201, 
                        f'Expected Response Code 201 - CREATED, received {response.status_code} instead.')

Я получаю следующую ошибку:

line 105, in test_like_post_user
    f'Expected Response Code 201 - CREATED, received {response.status_code} instead.')
AssertionError: 400 != 201 : Expected Response Code 201 - CREATED, received 400 instead.

Строка 105 - это строка сf-строка - последняя строка. Однако, когда я запускаю сервер и проверяю эту конечную точку вручную - все работает просто отлично. Я полагаю, что проблема заключается в том, как я сформулировал тестовую функцию.

Спасибо!

1 Ответ

0 голосов
/ 21 ноября 2019

Проблема может быть связана с тем, как вы обрабатываете вызов функции post, где вы посылаете kwargs в качестве именованного аргумента. Вместо этого эта строка должна быть в порядке, передавая только PK, а не весь объект:

request = self.factory.post('likes/', {'reader': self.user.pk, 'article': self.article.pk})

Это обычная структура, класс APIRequestFactory обрабатывает запросы.

...