2013-03-19 69 views
2

我試圖用mock.patch模擬窗體並且不能。我有這樣的代碼在django測試中修補(嘲諷)表單形式

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很好的答案和良好的代碼示例

+0

http://williamjohnbert.com/2011/07/how-to -unit-testing-in-django-with-mocking-and-patching/ – catherine 2013-03-19 11:33:25

+0

@catherine我試過你的方法但它不適用於我 – kharandziuk 2013-03-19 12:43:13

+0

@MaxKharandziuk你能否詳細說明上「不起作用」? – 2013-03-19 12:50:41

回答

5

當您使用補丁時,您可以指定要模擬的對象的目標。這通常是它被輸入的地方,而不是它被定義的地方。

這是因爲當您的測試運行時,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() 
+0

非常好的答案。你做了正確和真正美麗的代碼示例 – kharandziuk 2013-03-19 15:39:44

+0

+1'CreatePostForm'的namepsace在視圖中。修補程序使用的位置(基於導入)。 http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch – CppLearner 2013-03-24 17:07:45