Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django测试中的修补(模拟)表单_Python_Django_Testing_Mocking_Python Mock - Fatal编程技术网

Python django测试中的修补(模拟)表单

Python django测试中的修补(模拟)表单,python,django,testing,mocking,python-mock,Python,Django,Testing,Mocking,Python Mock,我试着用mock.patch来模拟表单,但是不行。我有这个密码 forms.py class CreatePostForm(object): pass class CreatePostForm(object): pass views.py: from forms import CreatePostForm def doit(): print CreatePostForm() from forms import CreatePostForm def doit():

我试着用mock.patch来模拟表单,但是不行。我有这个密码

forms.py

class CreatePostForm(object):
    pass
class CreatePostForm(object):
    pass
views.py:

from forms import CreatePostForm

def doit():
    print CreatePostForm()
from forms import CreatePostForm

def doit():
    print CreatePostForm()
我想单独测试一下这个观点。我试着用mock.patch修补表单,我写了这样的东西:

tests.py:

from mock import patch

import views

with patch('forms.CreatePostForm') as Form:
    views.doit()
from mock import patch

import views

with patch('views.CreatePostForm') as Form:
    views.doit()
我试图用谷歌搜索解决方案,但什么也找不到


回答:感谢@dstanek提供了良好的回答和代码示例

使用补丁时,您可以指定要模拟的对象的目标。这通常是导入位置,而不是定义位置

这是因为在测试运行时,
视图
模块已经导入。如果您像我在下面的示例中那样导入类,那么
视图
模块将包含对
表单.CreatePostForm
的引用。因此,更改
forms.CreatePostForm
不会更改此引用。如果按照视图中指定的
forms.CreatePostForm
导入模块,情况会有所不同

我在下面列出了一个极其简单的例子

forms.py

class CreatePostForm(object):
    pass
class CreatePostForm(object):
    pass
views.py:

from forms import CreatePostForm

def doit():
    print CreatePostForm()
from forms import CreatePostForm

def doit():
    print CreatePostForm()
tests.py:

from mock import patch

import views

with patch('forms.CreatePostForm') as Form:
    views.doit()
from mock import patch

import views

with patch('views.CreatePostForm') as Form:
    views.doit()

@凯瑟琳:我试过你的方法,但对我不起作用me@MaxKharandziuk你能详细解释一下“不起作用”吗?回答得非常好。代码+1的示例是正确的,非常漂亮,
CreatePostForm
的名称在视图中。使用位置的修补程序(基于导入)。