Как я могу решить проблему Not found при получении из pytest-django через pk?
У меня проблема с django-pytest
Я использую, djnago-rest-framework
.
Возникла проблема с тестированием. Как показано в коде ниже, я ввел одинаковые коды detail1, detail2 и detail3. Однако только detail1 проходит успешно, а detail2, detail3 показывают, что '/api/v1/stats/1/' не может быть найден. Это также происходит при выполнении delete. Мне интересно узнать причину и решение этой ошибки.
введите описание изображения здесь
// tests/test_apis.py
import json
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from stats.models import Stats
class StatsApiTests(APITestCase):
def setUp(self):
Stats.objects.get_or_create(blockshots=1, memo='test1')
Stats.objects.get_or_create(blockshots=2, memo='test2')
self.create_read_url = reverse('api:stats:stats-list')
self.read_update_delete_url = reverse('api:stats:stats-detail', kwargs={'pk': '1'})
def test_detail1(self):
response = self.client.get(self.read_update_delete_url)
data = json.loads(response.content)
content = {
'blockshots': 1,
'memo': 'test1',
}
self.assertEqual(data, content)
def test_detail2(self):
response = self.client.get(self.read_update_delete_url)
data = json.loads(response.content)
content = {
'blockshots': 1,
'memo': 'test1',
}
self.assertEqual(data, content)
def test_detail3(self):
response = self.client.get(self.read_update_delete_url)
data = json.loads(response.content)
content = {
'blockshots': 1,
'memo': 'test1',
}
self.assertEqual(data, content)
def test_list(self):
response = self.client.get(self.create_read_url)
self.assertContains(response, 'test1')
self.assertContains(response, 'test2')
Трудно понять, что на самом деле реализовано для read_update_delete_url, поэтому я предполагаю, что это поиск ресурса по первичному ключу. В таком случае, вы можете просто добавить первичный ключ в url следующим образом:
stat_one, _ = Stats.objects.get_or_create(blockshots=1, memo='test1')
stat_two, _ = Stats.objects.get_or_create(blockshots=2, memo='test2')
self.read_update_delete_url = reverse('api:stats:stats-detail', kwargs={'pk': stat_one.pk})
В основном, get_or_create возвращает объект и состояние объекта (создан или нет). Вы можете использовать id объекта в качестве параметра функции reverse.