我应该如何对我的 Pyramid 应用程序的路由匹配进行单元测试?

How should I unit test my Pyramid app's route matching?

我正在编写一个 Pyramid 网络应用程序,它使用 URL 调度将路由映射到视图。

我想编写一组单元测试,为 Pyramid 的 "route matcher" 提供各种路径,然后断言:

  1. 正确的观点叫做
  2. request.matchdict 包含预期的内容

如何在适当的 unit 测试级别(而不是在功能级别,通过提交实际的 HTTP 请求)执行此操作? Pyramid 中的哪个 "unit" 实际上进行了路由匹配,我如何访问它来测试我的应用程序配置的路由?

注意:我知道我可以使用功能测试来做到这一点,但我问这个问题是因为我想知道如何更窄地测试它——只是路由匹配部分。我想我正在寻找的可能被认为是集成测试而不是单元测试,因为它涉及多个组件...

我用 Google 搜索并阅读了相关的 Pyramid 文档,包括 Dispatching URLs To Views With Routing and Unit, Integration, and Functional Testing。我没有看到任何东西告诉我如何在不进行功能测试的情况下测试我的应用程序的配置路由。

金字塔中没有 public api 可以做到这一点。但是,它有一个私有且相当稳定的 API。您已被警告。

路由匹配不仅仅发生在模式上,还发生在谓词上,因此它需要一个完整的请求对象来进行匹配,而不仅仅是一个 url.

registry = config.registry or request.registry
mapper = registry.getUtility(pyramid.interfaces.IRoutesMapper)
result = mapper(request)
route, matchdict = result['route'], result['match']
if route is not None:
    route  # pyramid.interfaces.IRoute object
    matchdict  # request.matchdict

原始 IRoute 对象本身 通过内省器在 public api 上可用。您可以查找这些并在每个路由的基础上与它们进行匹配,但这将忽略 Pyramid 固有的路由排序。

introspector = config.registry or request.registry.introspector
intr = introspector.get('routes', route_name)
route = intr['route']
match = route.match(path)
if match is not None:
    route  # pyramid.interfaces.IRoute object
    match  # request.matchdict

路由上还有谓词,您可以将 request 传递给它以确定谓词是否通过。