在Django测试中补丁(模拟)表单
我尝试用mock.patch来模拟一个表单,但没成功。我有以下代码:
forms.py
class CreatePostForm(object):
pass
views.py:
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()
我在网上搜索解决方案,但没有找到。
已回答:感谢@dstanek提供了很好的答案和代码示例。
1 个回答
5
当你使用patch的时候,你需要指定你想要模拟的对象的目标。这个目标通常是对象被导入的地方,而不是它被定义的地方。
这是因为在你的测试运行时,views
模块已经被导入了。如果你像我下面的例子那样导入类,那么views
模块就会包含对forms.CreatePostForm
的引用。所以,改变forms.CreatePostForm
并不会改变这个引用。如果你在视图中按照forms.CreatePostForm
的方式导入模块,那情况就会有所不同。
我在下面提供了一个非常简单的例子。
forms.py
class CreatePostForm(object):
pass
views.py:
from forms import CreatePostForm
def doit():
print CreatePostForm()
tests.py:
from mock import patch
import views
with patch('views.CreatePostForm') as Form:
views.doit()