代码之家  ›  专栏  ›  技术社区  ›  Stew

我应该如何对我的金字塔应用程序的路径匹配进行单元测试?

  •  0
  • Stew  · 技术社区  · 8 年前

    我正在编写一个金字塔web应用程序,它使用URL调度将路由映射到视图。

    我想编写一组单元测试,为Pyramid的“路由匹配器”提供各种路径,然后断言:

    1. 正确的视图称为
    2. 这个 request.matchdict 包含预期内容

    我怎样才能在适当的时间做这件事 单元 测试级别(与功能级别相反,通过提交实际HTTP请求)?金字塔中的哪个“单元”实际进行路由匹配,我如何访问它来测试我的应用程序配置的路由?

    注释 :我知道我可以使用 功能的 测试,但我问这个问题是因为我想知道如何更窄范围地测试它——只是路由匹配部分。我想我要找的可能是集成测试而不是单元测试,因为它涉及多个组件。。。

    我在谷歌上搜索并阅读了相关的金字塔文档,包括 Dispatching URLs To Views With Routing Unit, Integration, and Functional Testing . 我所看到的一切都没有告诉我如何在不进行功能测试的情况下测试应用程序的配置路由。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Michael Merickel    8 年前

    在金字塔中没有一个公共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 对象本身 可通过introspector在公共api上获得。您可以在每个路由的基础上查找并匹配它们,但这将忽略金字塔固有的路由顺序。

    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 以确定谓词是否通过。