Monkeypatching clean () в классе формы django - PullRequest
0 голосов
/ 24 декабря 2018

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

...