使用 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 授权、__acl__ 和 RootFactory 混淆