Django Form类中的Monkeypatching clean()方法

时间:2018-12-24 11:08:04

标签: django forms testing django-class-based-views pytest-django

我在Django 2.1python 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和测试领域的新手,这可能是一个非常明显的案例,但是我没有找到有关它的解释。

0 个答案:

没有答案