具有从请求对象分配的字段的 Django 单元测试表单
Django unit testing form with field assigned from request object
我有这个表格
class PostCreationForm(forms.ModelForm):
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
我正在尝试使用此测试对其进行单元测试
class PostCreationByFormTestCase(TestCase):
def __init__(self, *args, **kwargs):
super(PostCreationByFormTestCase, self).__init__(*args, **kwargs)
self.CustomUser = get_user_model()
def setUp(self):
self.credentials = {
'username': 'john_smith',
'password': 'St0ngPassw0rd'
}
self.user = self.CustomUser.objects.create(
username=self.credentials['username'],
email='john_smith@mail.com',
password=self.credentials['password'],
first_name='John',
last_name='Smith'
)
def test_simple_form(self):
form_data = {
'author': self.user,
'title': 'Simple Post',
'description': 'very good description',
}
form = PostCreationForm(form_data)
self.assertTrue(form.is_valid)
post = form.save()
断言通过,但 form.save()
产生
django.db.utils.IntegrityError:列“author_id”中的空值违反了非空约束
我尝试将表格更改为
class PostCreationForm(forms.ModelForm):
def form_valid(self, form):
if not form.instance.author:
form.instance.author = self.request.user
return super().form_valid(form)
但还是不行。如果我不想将它作为用户的输入,我认为这是将字段分配给对象的推荐方法,在这种情况下,我希望 post 的作者成为当前用户。
我应该如何解决这个问题才能测试表单?
检查表单是否有效时需要调用方法 is_valid
,它不是属性。将 form.is_valid
更改为 form.is_valid()
即可。
form_valid()
但是当您检查 form.is_valid()
时不会调用,因此您可能想使用 clean
方法。一个未经测试的例子:
class PostCreationForm(forms.ModelForm):
def clean_author(self):
author = self.cleaned_data.get('author')
if not author:
author = self.request.user
return author
我有这个表格
class PostCreationForm(forms.ModelForm):
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
我正在尝试使用此测试对其进行单元测试
class PostCreationByFormTestCase(TestCase):
def __init__(self, *args, **kwargs):
super(PostCreationByFormTestCase, self).__init__(*args, **kwargs)
self.CustomUser = get_user_model()
def setUp(self):
self.credentials = {
'username': 'john_smith',
'password': 'St0ngPassw0rd'
}
self.user = self.CustomUser.objects.create(
username=self.credentials['username'],
email='john_smith@mail.com',
password=self.credentials['password'],
first_name='John',
last_name='Smith'
)
def test_simple_form(self):
form_data = {
'author': self.user,
'title': 'Simple Post',
'description': 'very good description',
}
form = PostCreationForm(form_data)
self.assertTrue(form.is_valid)
post = form.save()
断言通过,但 form.save()
产生
django.db.utils.IntegrityError:列“author_id”中的空值违反了非空约束
我尝试将表格更改为
class PostCreationForm(forms.ModelForm):
def form_valid(self, form):
if not form.instance.author:
form.instance.author = self.request.user
return super().form_valid(form)
但还是不行。如果我不想将它作为用户的输入,我认为这是将字段分配给对象的推荐方法,在这种情况下,我希望 post 的作者成为当前用户。 我应该如何解决这个问题才能测试表单?
检查表单是否有效时需要调用方法 is_valid
,它不是属性。将 form.is_valid
更改为 form.is_valid()
即可。
form_valid()
但是当您检查 form.is_valid()
时不会调用,因此您可能想使用 clean
方法。一个未经测试的例子:
class PostCreationForm(forms.ModelForm):
def clean_author(self):
author = self.cleaned_data.get('author')
if not author:
author = self.request.user
return author