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)