Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django REST框架。APITestCase。如何修复';错误的值、引用的表名称、引用的列名称和x27;_Django_Unit Testing_Django Rest Framework - Fatal编程技术网

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