我想测试如下所示的金字塔视图:
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
的想法(。我想做的是在app
或test_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
属性,这是传递给渲染器的值,尽管我不建议使用它,因为它不在公共接口中。