在Django测试中补丁(模拟)表单

2 投票
1 回答
2307 浏览
提问于 2025-04-17 19:37

我尝试用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()

撰写回答