在Pyramid中模拟render到响应
我有一个装饰器,长得像这样:
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,但我有点不知道该怎么做。如果有人有建议,我会非常感激。
2 个回答
0
以下方法对我有效:
def setUp(self):
self.app = TestApp(target_app())
self.config = testing.setUp(request=testing.DummyRequest)
self.config.include('pyramid_jinja2')
通过设置配置来包含jinja,这样你的测试就能找到你的模板和jinja环境了。你可能还需要在测试文件夹里放一个模板的测试版本。如果在运行测试时出现类似“找不到模板”的错误信息,确保模板的版本放在正确的位置。
0
Mock库非常棒:
mock库提供了一个核心的Mock类,这样你就不需要在测试中创建很多临时的替代品了。在执行某个操作后,你可以检查哪些方法或属性被使用了,以及它们是用什么参数调用的。你还可以指定返回值,并像平常一样设置需要的属性。
另外,mock库还提供了一个patch()装饰器,可以在测试范围内处理模块和类级别的属性替换。
你的代码看起来会像这样:
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')