如果提供了额外的字段,Django 会使表单测试无效
Django Invalidate Form Test If Extra Field Supplied
我遇到了一些问题,用户变量泄漏到注册表单上允许用户在创建用户时设置这些变量。
能否通过测试保证不会再出现这种情况?
举例来说,我不希望用户可以设置自己的 'coupon_code'。我将如何对此进行测试?
Accounts/forms.py:
from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import User
class RegisterUserForm(UserCreationForm):
email = forms.EmailField(required=True, help_text='Required.')
class Meta(UserCreationForm.Meta):
model = User
fields = ('username', 'password1', 'password2', 'email')
exclude = ('coupon_code',)
Accounts/tests/test_forms.py:
from django.test import TestCase
from Accounts.forms import RegisterUserForm, UpdateUserForm
# Create your tests here.
class RegisterUserFormTest(TestCase):
#@classmethod
#def setUpTestData(cls):
# Set up non-modified objects used by all test methods
def valid_data(self):
return {'username':'abc', 'email':'abc@abc.com', 'password1': 'test123hello', 'password2':'test123hello'}
def test_register_user_form_cannot_set_coupon_code(self):
data = self.valid_data()
data['coupon_code'] = '42'
form = RegisterUserForm(data=data)
self.assertFalse(form.is_valid())
目前上述测试失败,因为表单被认为是有效的,即使排除字段存在
据我了解,is_valid()
方法会忽略传递给 Form 的额外数据。如果 is_valid()
它 returns True
,那只意味着数据对规定的字段有效,只有那些字段会在 cleaned_data 字典中(Django docs about this) .
我认为您要执行的测试必须在使用此窗体的视图函数上完成。它可能看起来像这样:
from django.test import Client
def test_your_user_creation_view(self):
c = Client()
c.post(reverse(<your view name>),<valid data with 'coupon_code':42>)
new_user = User.objects.get(username='abc')
self.assertTrue(new_user.coupon_code != '42')
self.assertEqual(new_user.coupon_code,<your default value for coupon_code>)
我遇到了一些问题,用户变量泄漏到注册表单上允许用户在创建用户时设置这些变量。
能否通过测试保证不会再出现这种情况?
举例来说,我不希望用户可以设置自己的 'coupon_code'。我将如何对此进行测试?
Accounts/forms.py:
from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import User
class RegisterUserForm(UserCreationForm):
email = forms.EmailField(required=True, help_text='Required.')
class Meta(UserCreationForm.Meta):
model = User
fields = ('username', 'password1', 'password2', 'email')
exclude = ('coupon_code',)
Accounts/tests/test_forms.py:
from django.test import TestCase
from Accounts.forms import RegisterUserForm, UpdateUserForm
# Create your tests here.
class RegisterUserFormTest(TestCase):
#@classmethod
#def setUpTestData(cls):
# Set up non-modified objects used by all test methods
def valid_data(self):
return {'username':'abc', 'email':'abc@abc.com', 'password1': 'test123hello', 'password2':'test123hello'}
def test_register_user_form_cannot_set_coupon_code(self):
data = self.valid_data()
data['coupon_code'] = '42'
form = RegisterUserForm(data=data)
self.assertFalse(form.is_valid())
目前上述测试失败,因为表单被认为是有效的,即使排除字段存在
据我了解,is_valid()
方法会忽略传递给 Form 的额外数据。如果 is_valid()
它 returns True
,那只意味着数据对规定的字段有效,只有那些字段会在 cleaned_data 字典中(Django docs about this) .
我认为您要执行的测试必须在使用此窗体的视图函数上完成。它可能看起来像这样:
from django.test import Client
def test_your_user_creation_view(self):
c = Client()
c.post(reverse(<your view name>),<valid data with 'coupon_code':42>)
new_user = User.objects.get(username='abc')
self.assertTrue(new_user.coupon_code != '42')
self.assertEqual(new_user.coupon_code,<your default value for coupon_code>)