2010-04-12 59 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