在金字塔视图测试中获取当前路线

问题描述

我正在尝试测试使用request.current_route_path()的金字塔视图。

我要进行基本的测试设置,直接从文档开始:

from ..views.auth import signup
...
class ....:
    def test_signup_view(self):
        with testing.testConfig():
            signup(testing.DummyRequest(self.session))

我使用的配置类似于https://docs.pylonsproject.org/projects/pyramid/en/latest/tutorials/wiki2/tests.html

class BaseTest(unittest.TestCase):
    def setUp(self) -> None:
        self.config = testing.setUp(settings={
            'sqlalchemy.url': self.postgresql.url().replace("postgresql","postgresql+pg8000",1)
        })
        self.config.include('..models')
        self.config.include('..routes')
        ...

但这会导致ValueError: Current request matches no route

我在path="/signup"添加DummyRequest参数,但最终出现了相同的错误

我的路线基于uri,而不是基于资源,因此用于测试的具体路线为:

def includeme(config):
    ...
    config.add_route('signup','/signup')
    ...

我该如何解决

解决方法

通过current_route_path模拟DummyRequest并不是一件容易的事,因为它依赖于名为IRoute的{​​{1}}对象,而它正在matched_route进行获取路线名称,以及生成路线所需的元数据。当请求实际上与路由匹配时,通常由路由器附加该对象。

我认为您有3种选择:

  1. 使用request.matched_route.name的版本完全模拟请求对象上的函数,该版本返回所需的内容。例如current_route_path。如果这不是您测试的重点,那就太好了。

  2. 从内部检查器中拉request.current_route_path = lambda *a,**kw: '/path'对象,并将其附加到虚拟请求。这需要学习内省型api,并将其从中拉出并将其设置为IRoute

  3. 使用通过路由器的功能测试,此时Pyramid将为您正确设置东西。