我有以下观点:
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)
我该如何测试?我将很感谢您的帮助
答案 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文件,您可以对其进行进一步的测试。