Django REST framework.APITestCase.Как проверить, какие ответы для загрузки данных в CSV - PullRequest
0 голосов
/ 04 июля 2019

У меня есть такие просмотры, как:

class StudentAPIPerformanceReport(
    generics.RetrieveAPIView,
):
    def get(self, request, *args, **kwargs):
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="report.csv"'

        writer = csv.writer(response)
        for student in Student.objects.filter(pk=self.kwargs['pk']):
            assigned_courses = CourseParticipant.objects.filter(student=student)
            completed_courses = assigned_courses.filter(completed=True)

            headings = (
                "student full Name",
                "number of assigned courses to student",
                "number of completed courses by student"
            )
            rows = (
                student.full_name,
                assigned_courses.count(),
                completed_courses.count()
            )

            writer.writerow(headings)
            writer.writerow(rows)

        return response

URL:

    path(
    'student/report/<int:pk>/',
    StudentAPIPerformanceReport.as_view(),
    name='student_performance'
)

И проверка на это:

class StudentAPIPerformanceReportTestCase(APITestCase):
def setUp(self):
    self.student_obj = Student.objects.create(
        first_name='test',
        last_name='student',
        email='test_student@gmail.com',
    )
    self.course_obj = Course.objects.create(
        name='test',
    )
    student_obj = CourseParticipant.objects.create(
        course_id=self.course_obj.pk,
        student_id=self.student_obj.pk,
    )

def test_student_unassigned_from_course(self):
    data_id = self.student_obj.pk
    rud_url = api_reverse('student:student_performance', kwargs={'pk': data_id})

    get_response = self.client.get(rud_url, data_id)
    self.assertEqual(get_response.status_code, status.HTTP_200_OK)

Но у меня есть трассировка:

Отслеживание ошибок (последний вызов был последним): файл "/home/project/test_task/student/tests.py", строка 120, в файле test_student_unassigned_from_course get_response = self.client.get (rud_url, data_id)«/home/project/test_task/venv/lib/python3.7/site-packages/rest_framework/test.py», строка 292, в get response = super (APIClient, self) .get (путь, данные = данные, ** extra) Файл "/home/project/test_task/venv/lib/python3.7/site-packages/rest_framework/test.py", строка 199, в get 'QUERY_STRING': urlencode (data or {}, drugq = True), Файл "/home/project/test_task/venv/lib/python3.7/site-packages/django/utils/http.py", строка 93, в urlencode для ключа, значение в запросе: TypeError: объект 'int'не повторяется

API, который я хочу протестировать, просто сделайте какой-нибудь CSV-файл в формате:

test student,1,0

Как я могу это проверить?Буду благодарен за помощь

1 Ответ

1 голос
/ 04 июля 2019

Ошибка, которую вы получаете от того, как вы звоните self.client.get.


TypeError: объект 'int' не повторяется

- это второй параметр, который вы передаете в этой конкретной строке:

get_response = self.client.get(rud_url, data_id)
# ______________________________________^

data_id сам по себе является первичным ключом объекта учащегося, который представляет собой простой целочисленный идентификатор.

Если вы посмотрите на документы Django здесь , второй параметр get() - это данные, которые словарь , а не целое число . Вот почему он пытается повторить этот параметр, но он не повторяется .

Поскольку вы уже вложили свой первичный ключ в URL (в reverse()), нет необходимости присоединять его в качестве параметра запроса GET-запроса, выполняемого self.client.get().


После удаления data_id из функционального вызова get()

get_response = self.client.get(rud_url)

это должно сработать, и вы успешно получите CSV-файл в ответе, который вы можете проверить дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...