Я использую 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
, но я не понимал, как ввести условия моего теста вa django class ...
Я использую свои чувства, чтобы построить этот тест, но я не могу поднять ожидаемый 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 и тестировании, возможно, это очень очевидный случай, но я не нашел объяснения по этому поводу.