代码之家  ›  专栏  ›  技术社区  ›  TomáÅ¡ Záluský

利用Spring Restdocs DSL进行验证

  •  1
  • TomáÅ¡ Záluský  · 技术社区  · 6 年前

    我们的REST API由一组使用Spring Restdocs的测试以标准方式(通过 mockMvc.perform(...)...andDo(document().fieldWithPath(...)) 陈述。由于字段有类型和强制/可选标志,所以我想重用这些信息,以便在生产代码中进行响应体验证。

    我把Spring Restdocs移到 compile Maven作用域并将代码段创建移到生产代码中,在生产代码中,src/main代码中的文档化测试和响应体拦截器都可以看到它(后者只调用 ResponseFieldsSnippet.createModel 方法)。除了以下陷阱之外,一切正常:空的对象集合看起来无效,因为框架试图匹配 fieldWithPath 对象字段对不存在数据的规则。

    例如,假设cat的JSON描述为 fieldWithPath("kittens[]"), fieldWithPath("kittens[].name") ,实际的JSON {"kittens":[]} 由于不满足后一个描述符,因此显示为无效。对于制造数据的测试样本而言,这种情况不会发生,以最大限度地提高文档效益,但对于实际情况来说却是个问题。

    基于这一观察,我倾向于认为重用Restdocs DSL进行验证是一个坏主意。在切换到重量级解决方案la JSON模式之前,我想问:Restdocs是否提供了某种方式将字段描述符表示为树而不是规则列表?例如,上面的 fieldWithPath("kittens[]", subfieldWithPath("name")) . (我认为不管我的情况有多恶劣,这都是有用的。)

    我浏览并详细阐述了看起来很有前途的文档中的示例,但AFAIK实际上并没有涵盖这个案例,即:subsectionWithPath(跳过子树)、beneathPath(只关注子树)或 ResponseFieldsSnippet.andWithPrefix (仅用于创建列表的快捷方式,但仍然是列表而不是树)。

    谢谢你的意见!

    1 回复  |  直到 6 年前
        1
  •  1
  •   TomáÅ¡ Záluský    6 年前

    我终于发现问题在新的库版本中得到了解决,即1.2.5和2.0.2(我有1.2.2)。上面的例子必须表示为

    fieldWithPath("kittens"),
    fieldWithPath("kittens[]").optional(),
    fieldWithPath("kittens[].name").type(STRING)
    

    这个设置显示 kitten 字段本身是必需的,但数组允许为空,因此没有字段 name 在这种情况下( type 因为库不能从数据中获得线索,所以必须显式地声明of name)。

    更多信息: original issue , example above just as project test case ,另一个示例可以在从问题链接的提交中找到。

    (注意:升级到2.0.2) didn't work for me 因为它还需要升级Spring,这是目前不可能的。)

    原问题的答案是 ,因为Spring Restdocs仍然保留字段描述符的列表格式。不过,在这次修复之后,我似乎不太在意。