Django REST框架。APITestCase。如何修复';错误的值、引用的表名称、引用的列名称和x27;
我有以下型号:Django REST框架。APITestCase。如何修复';错误的值、引用的表名称、引用的列名称和x27;,django,unit-testing,django-rest-framework,Django,Unit Testing,Django Rest Framework,我有以下型号: class Student(models.Model): first_name = models.CharField(verbose_name='student first name', max_length=64) last_name = models.CharField(verbose_name='student last name', max_length=64) email = models.EmailField() class Meta: d
class Student(models.Model):
first_name = models.CharField(verbose_name='student first name', max_length=64)
last_name = models.CharField(verbose_name='student last name', max_length=64)
email = models.EmailField()
class Meta:
db_table = 'student'
def __str__(self):
return self.first_name + ' ' + self.last_name
class Course(models.Model):
name = models.CharField(max_length=255)
description = models.TextField()
start_date = models.DateField(null=True, blank=True, default=None)
end_date = models.DateField(null=True, blank=True, default=None)
class Meta:
db_table = 'course'
def __str__(self):
return self.name
class CourseParticipant(models.Model):
course = models.ForeignKey(Course, related_name='courses', on_delete=models.CASCADE)
student = models.ForeignKey(Student, related_name='student_name', on_delete=models.CASCADE)
completed = models.BooleanField(null=False, default=False)
class Meta:
db_table = 'course_participant'
def __str__(self):
return self.course, self.student
网址:
并对其进行测试:
from rest_framework import status
from rest_framework.test import APITestCase
from rest_framework.reverse import reverse as api_reverse
from course.models import CourseParticipant
from .models import Student
class StudentAPITestCase(APITestCase):
def setUp(self):
student_obj = Student.objects.create(
first_name='test',
last_name='student',
email='test_student@gmail.com',
)
def create_item(self):
url = api_reverse('student:list')
data = {
'first_name': 'some_first_name_for_test',
'last_name': 'some_last_name_for_test',
'email': 'test_student@gmail.com'
}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Student.objects.count(), 2)
return response.data
def test_student_create(self):
data = self.create_item()
data_id = data.get('id')
rud_url = api_reverse('student:detail', kwargs={'pk': data_id})
rud_data = {
'first_name': 'some_new_first_name_for_test',
'last_name': 'some_new_last_name_for_test'
}
get_response = self.client.get(rud_url, rud_data, format='json')
self.assertEqual(get_response.status_code, status.HTTP_200_OK)
def test_student_update(self):
data = self.create_item()
data_id = data.get('id')
rud_url = api_reverse('student:detail', kwargs={'pk': data_id})
rud_data = {
'first_name': 'some_new_first_name_for_test',
'last_name': 'some_new_last_name_for_test',
'email': 'test_student@gmail.com'
}
put_response = self.client.put(rud_url, rud_data, format='json')
self.assertEqual(put_response.status_code, status.HTTP_200_OK)
def test_student_delete(self):
data = self.create_item()
data_id = data.get('id')
rud_url = api_reverse('student:detail', kwargs={'pk': data_id})
delete_response = self.client.delete(rud_url, data_id, format='json')
self.assertEqual(delete_response.status_code, status.HTTP_204_NO_CONTENT)
get_response = self.client.delete(rud_url, format='json')
self.assertEqual(get_response.status_code, status.HTTP_404_NOT_FOUND)
class StudentAssignToCourseAPITestCase(APITestCase):
def setUp(self):
student_obj = CourseParticipant.objects.create(
course_id=1,
student_id=1,
)
def test_create_item(self):
url = api_reverse('student:assign_student_to_course')
data = {
'course_id': 1,
'student_id': 1,
}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Student.objects.count(), 2)
return response.data
StudentAssignToCourseAPITestCase的所有测试均通过,但StudentAssignToCourseAPITestCase的测试失败,并进行了一些回溯:
回溯(最近一次呼叫最后一次):
文件“/home/leonidsuputnyak/БСцццццц/project/testцtask/venv/lib/python3.7/site packages/django/test/testcases.py”,第274行,在调用
self.\u post\u teardown()
文件“/home/leonidsuputnyak/БСццццццц/project/testцtask/venv/lib/python3.7/site packages/django/test/testcases.py”,第1009行,在拆卸后
自紧装置拆卸()
文件“/home/leonidsuputnyak/БСцццццццц/project/testцtask/venv/lib/python3.7/site packages/django/test/testcases.py”,第1177行,位于“夹具拆卸”中
连接[db\u name]。检查\u约束()
文件“/home/leonidsuputnyak/Бцццццццц/project/testцtask/venv/lib/python3.7/site packages/django/db/backends/sqlite3/base.py”,第318行,检查约束条件
错误的\u值、引用的\u表\u名称、引用的\u列\u名称
django.db.utils.IntegrityError:主键为“1”的表“课程参与者”中的行具有无效外键:课程参与者.student\u id包含的值“1”在student.id中没有对应的值
有人能解释一下为什么我的StudentAssignTo Course ApiestCase测试失败,以及我可以如何修复它吗?测试失败,因为在
设置方法中,您试图使用不存在的学生id值创建CourseParticipant
。因此,您应该首先创建User
和Course
对象,并使用它们的ID:
class StudentAssignToCourseAPITestCase(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(
# couse's attribute here
)
student_obj = CourseParticipant.objects.create(
course_id=self.course_obj.pk,
student_id=self.student_obj.pk,
)
def test_create_item(self):
url = api_reverse('student:assign_student_to_course')
data = {
'course_id': self.course_obj.pk,
'student_id': self.student_obj.pk,
}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Student.objects.count(), 2)
return response.data
测试失败,因为在设置
方法中,您试图使用不存在的学生id值创建课程参与者
。因此,您应该首先创建User
和Course
对象,并使用它们的ID:
class StudentAssignToCourseAPITestCase(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(
# couse's attribute here
)
student_obj = CourseParticipant.objects.create(
course_id=self.course_obj.pk,
student_id=self.student_obj.pk,
)
def test_create_item(self):
url = api_reverse('student:assign_student_to_course')
data = {
'course_id': self.course_obj.pk,
'student_id': self.student_obj.pk,
}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Student.objects.count(), 2)
return response.data
class StudentAssignToCourseAPITestCase(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(
# couse's attribute here
)
student_obj = CourseParticipant.objects.create(
course_id=self.course_obj.pk,
student_id=self.student_obj.pk,
)
def test_create_item(self):
url = api_reverse('student:assign_student_to_course')
data = {
'course_id': self.course_obj.pk,
'student_id': self.student_obj.pk,
}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Student.objects.count(), 2)
return response.data