Django тестирует форму, self.request kwargs выдает keyerror

У меня есть модель формы, которая использует __init__ для получения kwargs. При запуске тестов я получаю keyerror: 'requests'. Для моего модульного теста я установил существующего пользователя и существующий объект, чтобы проверить наличие дубликатов для каждого пользователя. Вот форма и тест:

class CourseForm(ModelForm):
    """ Form used for both creating a new course or updating an existing course."""
    class Meta:
        model = Course
        fields = ('course_name', 'grade_level',)

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request')
        self.qc = Course.objects.filter(user=self.request.user)
        super().__init__(*args, **kwargs)

    def clean(self):
        super(CourseForm, self).clean()
        course_name = self.cleaned_data.get('course_name')
        grade_level = self.cleaned_data.get('grade_level')
        # check exising course_name per user
        # exclude(pk=self.instance.pk) because when we update we don't have to consider the current name
        if course_name and self.qc.exclude(pk=self.instance.pk).filter(course_name__iexact=course_name).exists():
            raise ValidationError("A course with that name already exists.")

        return self.cleaned_data
class CourseFormTests(TestCase):
    @classmethod
    def setUp(self):
        self.user = CustomUser.objects.create_user(
            username='tester',
            email='tester@email.com',
            password='tester123',
            is_teacher=True,
            is_active=True,
        )
        self.user.save()
        self.my_course = Course(user=self.user,
                                id='4d192045-07fa-477f-bac2-5a99fe2e7c04',
                                course_name="name",
                                grade_level="SEC")
        self.my_course.save()

    def test_CourseForm_valid(self):
        form = CourseForm(self.user, data={
            'user': self.user,
            'id': '4d192045-07fa-477f-bac2-5a99fe2e7c04',
            'course_name': "Science",
            'grade_level': "SEC"
        },)
        self.assertTrue(form.is_valid())

    def test_CourseForm_invalid_name_too_long(self):
        form = CourseForm(self.user, data={
            'user': self.user,
            'id': '4d192045-07fa-477f-bac2-5a99fe2e7c05',
            'course_name': "NameistoolongforthistobeOKNameistoolongforthistobeOK",
            'grade_level': "SEC"
        },)
        self.assertFalse(form.is_valid())

    def test_CourseForm_invalid_name_exists(self):
        form = CourseForm(self.user, data={
            'user': self.user,
            'id': '4d192045-07fa-477f-bac2-5a99fe2e7c05',
            'course_name': "name",
            'grade_level': "SEC"
        },)
        self.assertFalse(form.is_valid())

Точная ошибка:

line 107, in __init__
    self.request = kwargs.pop('request')
KeyError: 'request'

Форма работает на практике, но, очевидно, не проходит модульный тест.

Поскольку для инициализации вашей формы требуется запрос, вы не можете просто создать ее экземпляр, вам нужно отправить данные в виде запроса. Вы можете сделать это с помощью self.client.post,, например

def test_CourseForm_invalid_name_exists(self):
    #we use client.post because the form requires a request in __init__()
    response = self.client.post("/form/url/", data={
        'user': self.user,
        'id': '4d192045-07fa-477f-bac2-5a99fe2e7c05',
        'course_name': "name",
        'grade_level': "SEC"
    },)
    self.assertContains(response, "A course with that name already exists.", html=True)
Вернуться на верх