如何对Django-CMS扩展进行单元测试?

Mar*_*som 13 django plugins django-cms

我正在努力为我正在研究的Django-CMS实现获得一些测试覆盖率,我不确定如何对插件/扩展进行单元测试.有没有人这样做过,如果有的话,怎么样?一些例子很棒.

Jac*_*son 5

如图所示的测试cms/tests/plugins.py是集成测试,而不是单元测试,而且重量非常大,需要整个系统中有时太大的部分启动和运行(不是必要的错误,只是在调试时不切实际).

DjangoCMS是紧密集成的,所以我在这里有一些技术可以"更接近金属",而不是一个完整的解决方案:

你需要一个'Expando'式的假类:

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

要实例化插件类的实例:

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()
Run Code Online (Sandbox Code Playgroud)

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

ctx = plugin.render({}, Expando(attr1='a1', attr2=123), None)
Run Code Online (Sandbox Code Playgroud)

使用实际模板渲染,检查输出:

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

在验证小DOM片段的内容时,BeautifulSoup非常方便.

使用管理表单字段间接检查模型属性是否正常运行:

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
Run Code Online (Sandbox Code Playgroud)


tcm*_*cmb 3

如果我正确理解你的问题,你可以在 cms/tests/plugins.py 模块中找到插件单元测试的示例,该模块位于 django-cms 安装的文件夹中。

基本上,您可以继承 CMSTestCase 并使用 django.test.client 中的 Client 类向 CMS 发出请求并检查结果响应。

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