微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在金字塔视图测试中获取当前路线

我正在尝试测试使用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将为您正确设置东西。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。