Python 模拟django表单数据字段

Python 模拟django表单数据字段,python,django,pytest,magicmock,Python,Django,Pytest,Magicmock,我有一个简单的django表单,如下所示: class ContactForm(forms.Form): subject = forms.CharField(max_length=100) message = forms.CharField(widget=forms.Textarea) def my_view(request): form = ContactForm(request.POST) if form.is_valid(): data = form.cl

我有一个简单的django表单,如下所示:

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField(widget=forms.Textarea)
def my_view(request):
  form = ContactForm(request.POST)
  if form.is_valid():
    data = form.cleaned_data

  ...
我的观点是这样使用的:

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField(widget=forms.Textarea)
def my_view(request):
  form = ContactForm(request.POST)
  if form.is_valid():
    data = form.cleaned_data

  ...
我想测试我的观点,而不关心表单的实际功能。到目前为止,我的测试就是这样的

@patch.object(ContactForm, 'is_valid')
def test_my_view(mock_is_valid):
  is_valid.return_value = True

  ...
  assert response.status_code == 201


但是,这不起作用,因为在调用
form.is\u valid()
之前,不会设置
form.cleaned\u数据。如果
form.cleaned\u data属性首先不存在,如何模拟该属性?

可以模拟整个form类,而不仅仅是一个方法:

@patch('myapp.views.ContactForm')
def test_my_view(mock_form_class):
    mock_form_class.return_value.is_valid = True
    mock_form_class.return_value.cleaned_data = {}
    ...
    assert response.status_code == 201

其中,
myapp.views
需要替换为应用程序的
views
模块的虚线路径。它假设您正在将
ContactForm
导入该模块,例如,使用
from。forms import ContactForm
您可以模拟整个表单类,而不仅仅是一个方法:

@patch('myapp.views.ContactForm')
def test_my_view(mock_form_class):
    mock_form_class.return_value.is_valid = True
    mock_form_class.return_value.cleaned_data = {}
    ...
    assert response.status_code == 201
其中,
myapp.views
需要替换为应用程序的
views
模块的虚线路径。它假定您正在将
ContactForm
导入该模块,例如,使用
from.forms导入ContactForm