2010-04-12 60 views
12

我想獲得一些Django-CMS實現的測試覆蓋率,我不確定如何單元測試插件/擴展。有沒有人曾經這樣做過,如果是這樣,怎麼樣?一些例子會很棒。如何對Django-CMS擴展進行單元測試?

+1

+1,我也有興趣在此。 – 2010-04-12 20:06:37

回答

2

如果我正確理解你的問題,可以在模塊cms/tests/plugins.py中找到插件單元測試的示例,該模塊位於保存django-cms安裝的文件夾中。

基本上,您可以繼承CMSTestCase並使用django.test.client的Client類向CMS發出請求並檢查生成的響應。

如何使用客戶端的信息可以在http://docs.djangoproject.com/en/dev/topics/testing/#module-django.test.client

4

測試發現如圖cms/tests/plugins.py是相當集成測試比單元測試,這是相當沉重的重量,需要整個系統的有時過於很大一部分啓動和運行(不需要錯誤,只是在調試時不切實際)。

DjangoCMS緊密集成所以我這裏有幾個技巧來獲得「更接近金屬」,而不是一個完整的解決方案:

你需要一個「爲Expando」式的假類:

class Expando(object): # Never use in production! 
    def __init__(self, **kw): 
     self.__dict__.update(kw) 

實例化插件類的一個實例:

from cms.plugin_pool import plugin_pool 

# ..in production code: class YourPlugin(CMSPlugin)... 

# This ensures that the system is aware of your plugin: 
YrPluginCls = plugin_pool.plugins.get('YourPlugin', None) 

# ..instantiate: 
plugin = YrPluginCls() 

完整性檢查插件.render方法:

ctx = plugin.render({}, Expando(attr1='a1', attr2=123), None) 

渲染與實際的模板,檢查輸出:

res = render_to_response(look.render_template, ctx) 
# assert that attr1 exist in res if it should 
# ..same for attr2 

BeautifulSoup驗證的小DOM片段內容時更是得心應手。

使用admin表單字段來間接檢查模型的屬性表現正常:

from django.test.client import RequestFactory 
from django.contrib.auth.models import AnonymousUser 

# ... 

request = RequestFactory().get('/') 
request.user = AnonymousUser() 
a_field = plugin.get_form(request).base_fields['a_field'] 
a_field.validate('<some valid value>') 
# Check that a_field.validate('<some invalid value>') raises