0

我想测试一个金字塔视图,如下所示:

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)。我想要做的是,在orindex的上下文中执行,但在它发送到渲染器之前取回结果。apptest_appindex

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

4

1 回答 1

2

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

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')

wheremyapp.init是一个与您的应用程序初始化函数执行相同工作的函数,该函数由pserve(like mainfunction here调用。除了myapp.init接受 1 个参数,即设置字典 (而不是main(global_config, **settings))。并返回 app (ie conf.make_wsgi_app()) 和conf(ie pyramid.config.Configuratorinstance)。rend是一个pyramid.testing.DummyTemplateRenderer实例。

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

UPD。忘了说rend_received属性,这是传递给渲染器的值,虽然我不建议使用它,因为它不在公共接口中。

于 2013-06-05T17:17:41.977 回答