我在Django 2.1
和python 3.6
上使用pytest-django 3.4
我喜欢测试这样定义的表单的clean()
方法:
from django.forms import HiddenInput, ModelForm, ValidationError
from log.models import Entry
class EntryForm(ModelForm):
class Meta:
model = Entry
fields = ['user', 'contact', 'title', 'desc']
widgets = {
'user': HiddenInput(),
'contact': HiddenInput(),
}
def __init__(self, *args, **kwargs):
""" Get back user & contact obj for `self.clean()` """
user = kwargs.pop('user')
contact = kwargs.pop('contact')
super(EntryForm, self).__init__(*args, **kwargs)
self.fields['user'].initial = user
self.fields['contact'].initial = contact
def clean(self):
"""
Checks if a entry is added on a contact owned by the connected user
"""
cleaned_data = super(EntryForm, self).clean()
if 'user' in self.changed_data or 'contact' in self.changed_data:
raise ValidationError("Hidden input changed")
if cleaned_data['contact'].user != cleaned_data['user']:
raise ValidationError("Not allowed")
在外部测试中,即使我更改隐藏输入的值:ValidationError
也会在浏览器中发挥作用。
我考虑使用monkeypatch
,但我不明白如何将测试条件插入 django 类中……
我会根据自己的感受进行测试,但是我无法提高预期的ValidationError
:
def fake_entry_form__init__():
self.fields['user'].initial = 'initial user'
self.fields['contact'].initial = 'initial contact'
def fake_entry_form_unvalid_changed_data():
return {
'user': 'foo user',
'contact': 'foo contact'
}
def test_entry_form_clean_unvalid(monkeypatch):
monkeypatch.setattr('log.forms.EntryForm.__init__', fake_entry_form__init__)
form = EntryForm
monkeypatch.setattr('log.forms.EntryForm.changed_data', fake_entry_form_unvalid_changed_data)
try:
form.clean
assert False
except KeyError:
assert True
我走上正轨还是完全错了?
我是django,CBV和测试领域的新手,这可能是一个非常明显的案例,但是我没有找到有关它的解释。