在Pyramid中模拟render到响应

1 投票
2 回答
1166 浏览
提问于 2025-04-18 10:48

我有一个装饰器,长得像这样:

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

撰写回答