使用 Pyramid 模拟渲染以响应

Posted

技术标签:

【中文标题】使用 Pyramid 模拟渲染以响应【英文标题】:Mocking render to response with Pyramid 【发布时间】:2014-08-13 21:52:54 【问题描述】:

我有一个看起来像这样的装饰器:

def validate_something(func):
    def validate_s(request):
        if request.property:
            render_to_response('template.jinja', 'error'
        return func(request)
    return validate_something

我正在尝试像这样测试它。我将本地 WSGI 堆栈作为应用程序加载。

from webtest import TestApp 
def setUp(self):
     self.app = TestApp(target_app())
     self.config = testing.setUp(request=testing.DummyRequest)   


def test_something(self):
    def test_func(request):
         return 1
    request = testing.DummyRequest()
    resp = validate_something(test_func(request))
    result = resp(request)

我得到的错误是(在最里面的 render_to_response 生成):

ValueError: no such renderer factory .jinja

我知道我需要模拟 render_to_response,但我不知道如何准确地做到这一点。如果有人有任何建议,我将不胜感激。

【问题讨论】:

【参考方案1】:

以下内容对我有用:

def setUp(self):
    self.app = TestApp(target_app())
    self.config = testing.setUp(request=testing.DummyRequest) 
    self.config.include('pyramid_jinja2')

通过设置包含 jinja 的配置,您的测试可以找到您的模板和 jinja 环境。您可能还需要在与测试相同的文件夹中提供模板的测试版本。如果您在运行测试时收到诸如 TemplateNotFound 之类的消息,请确保模板的版本位于正确的位置。

【讨论】:

【参考方案2】:

Mock 库很棒:

mock 提供了一个核心 Mock 类,无需创建主机 整个测试套件的存根。执行操作后,您可以 断言使用了哪些方法/属性,以及 他们被调用的参数。您还可以指定返回值 并以正常方式设置所需的属性。

另外,mock 提供了一个 patch() 装饰器来处理补丁 测试范围内的模块和类级别属性

Youc 代码如下所示:

def test_something(self):
    test_func = Mock.MagicMock(return_value=1)  # replaced stub function with a mock
    request = testing.DummyRequest()
    # patching a Pyramid method with a mock
    with mock.patch('pyramid.renderers.render_to_response' as r2r:
        resp = validate_something(test_func(request))
        result = resp(request)
        assert r2r.assert_called_with('template.jinja', 'error')

【讨论】:

以上是关于使用 Pyramid 模拟渲染以响应的主要内容,如果未能解决你的问题,请参考以下文章

Pyramid 中的强制性身份验证

使用 Pyramid 压缩所有 HTTP 流量

偶尔禁用 Pyramid 中间件

与 Pyramid 授权、__acl__ 和 RootFactory 混淆

使用 Python3 在 Pyramid 中使用 Websocket

在 Pyramid 中使用 URLDispatch 时,上下文谓词有用吗?