在django测试中修补(模拟)表单形式

kha*_*iuk 2 python testing django mocking python-mock

我试着用mock.patch模拟表单并且不能.我有这个代码

forms.py

class CreatePostForm(object):
    pass
Run Code Online (Sandbox Code Playgroud)

views.py:

from forms import CreatePostForm

def doit():
    print CreatePostForm()
Run Code Online (Sandbox Code Playgroud)

我希望孤立地测试这个视图.我尝试使用mock.patch修补表单,我写了类似的东西:

tests.py:

from mock import patch

import views

with patch('forms.CreatePostForm') as Form:
    views.doit()
Run Code Online (Sandbox Code Playgroud)

我试图谷歌寻求解决方案,什么也没发现

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

小智 5

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

这是因为在测试运行时,views模块已经导入.如果您正在导入该类,就像我在下面的示例中所做的那样,那么该views模块将包含对该类的引用forms.CreatePostForm.所以改变forms.CreatePostForm不会改变这个参考.如果您按forms.CreatePostForm视图中的指定导入模块,情况会有所不同.

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

forms.py

class CreatePostForm(object):
    pass
Run Code Online (Sandbox Code Playgroud)

views.py:

from forms import CreatePostForm

def doit():
    print CreatePostForm()
Run Code Online (Sandbox Code Playgroud)

tests.py:

from mock import patch

import views

with patch('views.CreatePostForm') as Form:
    views.doit()
Run Code Online (Sandbox Code Playgroud)