Django REST框架。 APITestCase。如何测试查看将数据下载到csv的响应

时间:2019-07-04 20:24:07

标签: django unit-testing django-rest-framework

我有以下观点:

y

网址:

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

并对其进行测试:

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

但是我有Traceback:

  

错误   追溯(最近一次通话):     在test_student_unassigned_from_course中的文件“ /home/project/test_task/student/tests.py”,第120行       get_response = self.client.get(rud_url,data_id)     在获取的文件“ /home/project/test_task/venv/lib/python3.7/site-packages/rest_framework/test.py”中,第292行       响应=超级(APIClient,自我).get(路径,数据=数据,**额外)     在获取文件“ /home/project/test_task/venv/lib/python3.7/site-packages/rest_framework/test.py”中,行199       'QUERY_STRING':urlencode(数据或{},doseq = True),     文件“ /home/project/test_task/venv/lib/python3.7/site-packages/django/utils/http.py”,第93行,使用urlencode       对于键,查询中的值:   TypeError:“ int”对象不可迭代

我不会测试的Api只会以以下格式制作一些csv文件:

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)

我该如何测试?我将很感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您收到的错误是由于您致电self.client.get的方式引起的。


  

TypeError:“ int”对象不可迭代

关于您要在此特定行中传递的第二个参数:

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

data_id本身是学生对象的主键,它是一个简单的整数ID。

如果您仔细查看Django文档here,则get()的第二个参数是数据,它是字典,而不是整数 >。这就是为什么它尝试迭代此参数,但它不可迭代的原因。

由于您已经将主键附加在url中(在reverse()中),因此不需要将其作为self.client.get()执行的GET请求的查询参数。


data_id函数调用中删除get()

get_response = self.client.get(rud_url)

它应该可以工作,并且您将在响应中成功获取CSV文件,您可以对其进行进一步的测试。