问题描述
我正在尝试测试使用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种选择:
-
使用
request.matched_route.name
的版本完全模拟请求对象上的函数,该版本返回所需的内容。例如current_route_path
。如果这不是您测试的重点,那就太好了。 -
从内部检查器中拉
request.current_route_path = lambda *a,**kw: '/path'
对象,并将其附加到虚拟请求。这需要学习内省型api,并将其从中拉出并将其设置为IRoute
。 -
使用通过路由器的功能测试,此时Pyramid将为您正确设置东西。