如果提供了额外的字段,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>)