【问题标题】:Django REST framework. APITestCase. How test views which response for download data to csvDjango REST 框架。 APITestCase。测试如何查看将数据下载到 csv 的响应
【发布时间】:2019-11-15 13:08:33
【问题描述】:

我的观点如下:

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'
)

并对其进行测试查看:

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)

但我有 Traceback:

错误 回溯(最近一次通话最后): 文件“/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(path, data=data, **extra) 文件“/home/project/test_task/venv/lib/python3.7/site-packages/rest_framework/test.py”,第 199 行,在 get 'QUERY_STRING': urlencode(data or {}, doseq=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

我如何测试它?我会很感激你的帮助

【问题讨论】:

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


    【解决方案1】:

    您收到的错误来自您调用self.client.get 的方式。


    TypeError: 'int' 对象不可迭代

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

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

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

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

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


    get() 函数调用中删除data_id

    get_response = self.client.get(rud_url)
    

    它应该可以工作,您将成功获得响应中的 CSV 文件,您可以进一步测试。

    【讨论】:

    • 是的。当我从 get_response = self.client.get(rud_url, data_id) 中删除“data_id”时,它可以工作,我得到了 CSV。谢谢你。需要更仔细地阅读文档。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多