创建金字塔请求进行测试,以便触发事件



我想测试如下所示的金字塔视图:

def index(request):
    data = request.some_custom_property.do_something()
    return {'some':data}

some_custom_property通过这样的事件处理程序添加到请求中:

@subscriber(NewRequest)
    def prepare_event(event):
        event.request.set_property(
            create_some_custom_property,
            'some_custom_property',reify=True
        )

我的问题是:如果我手动创建测试请求,则事件设置不正确,因为没有触发任何事件。由于实际事件处理程序更复杂并且取决于配置设置,因此我不想在测试代码中重现该代码。我想尽可能多地使用金字塔基础设施。我从前面的问题中学到了如何从 ini 文件设置真正的金字塔应用程序:

from webtest import TestApp
from pyramid.paster import get_app
app = get_app('testing.ini#main')
test_app = TestApp(app)

test_app工作正常,但我只能取回 html 输出(这是TestApp的想法(。我想做的是在apptest_app的上下文中执行index,但在将index结果发送到渲染器之前取回它。

任何提示如何做到这一点?

首先,我相信编写这样的文档测试是一个非常糟糕的主意。因为它需要大量的初始化工作,这将包含在文档中(记住文档测试(,并且不会"记录"任何东西。而且,对我来说,这些测试似乎是单元/集成测试的工作。但如果你真的想要,这里有一种方法可以做到:

import myapp
from pyramid.paster import get_appsettings
from webtest import TestApp
app, conf = myapp.init(get_appsettings('settings.ini#appsection'))
rend = conf.testing_add_renderer('template.pt')
test_app = TestApp(app)
resp = test_app.get('/my/view/url')
rend.assert_(key='val')

其中myapp.init是一个函数,它与应用程序初始化函数执行相同的工作,由pserve调用(就像这里的main函数一样。除了myapp.init需要 1 个参数,即设置字典(而不是 main(global_config, **settings) (。并返回应用程序(即 conf.make_wsgi_app() (和conf(即pyramid.config.Configurator实例(。 rend是一个pyramid.testing.DummyTemplateRenderer实例。

附言对不起我的英语,希望你能理解我的回答。

上。忘了提到rend_received属性,这是传递给渲染器的值,尽管我不建议使用它,因为它不在公共接口中。

最新更新