【问题标题】:Verify Joi validation was added to hapi route验证 Joi 验证已添加到 hapi 路由
【发布时间】:2018-06-25 17:31:10
【问题描述】:

我在代码中的多个位置重用 Joi 架构,我想找到一种干净的方法来测试我的端点是否分配了验证架构。这将很有帮助,因为我可以验证架构的行为方式是否符合我的预期,而无需在使用架​​构的任何地方重复相同系列的测试。

如果我有一个 hapi 服务器路由:

server.route({
  method: POST,
  path: 'myUrl',
  config: {
    validate: {
      payload: validation.myJoiValidation,
    }
  }
})

如何测试 validation.myJoiValidation 对象是否已分配给 config.validate.payload 元素?

我深入研究了 hapi 请求对象,发现我要查找的内容位于 request.route.settings.validate.payload._inner.children 对象中,但我真的不想依赖它来做我想做的事情。

【问题讨论】:

    标签: node.js validation testing hapijs joi


    【解决方案1】:

    如果您有一个在测试上下文中运行的服务器,您可以获得正在使用的验证架构:

    const schema = server.match('post', 'myUrl').settings.validate.payload;
    

    Schema 不能直接比较(如Hoek.deepEqual),但可以使用joi.describe 比较,所以:

    expect(joi.describe(schema)).to.equal(joi.describe(validation.myValidation));
    

    或者,如果您使用的是mocha/chai,我认为这是:

    expect(joi.describe(schema)).to.deep.equal(joi.describe(validation.myValidation));
    

    【讨论】:

      【解决方案2】:

      在您的单元测试中,使用 request 或具有未通过验证的有效负载的类似包发出请求。确保响应代码为 400。

      Example test 来自我的一个项目。它在this route 上测试正则表达式加入验证。这使用了一个名为 yarp 的小型承诺包装器。

      【讨论】:

      • 我已经在做类似的事情,但正在寻找替代方案。当在多个端点上使用相同的验证时,单元测试中会重复验证。我想将这些测试通用化,并且只有一组用于验证模式的测试,然后简单地验证每个端点都有分配给它的验证模式。
      • 如果它是您不信任的架构,那么您对架构进行了全面的单元测试(在任何路由之外),那么您只需在路由上进行一个简单的验证以验证是否存在架构它。在我们的团队中,我们的原则是我们的单元测试不是为了复制 hapi 和 joi。除非我们试图在特定路线上做一些不寻常的事情,否则我们不会详尽地测试每条路线上的每个模式。
      • 验证路由上是否存在模式是什么意思?您的意思是任何架构,但不是特定架构?我想验证应用的确切架构的原因是因为这个应用程序对传入数据的外观有严格的要求。因此,我想验证一个模式是否包含您建议的所需 Joi 验证,但还要验证是否在预期的位置分配了确切的模式。
      • 就像我说的,我不会重复单元测试。如果我在那里放置一个模式,我将编写一个单元测试来验证它不会采用格式错误的有效负载。如果它是我经常使用的模式,我会将模式保存在它自己的文件中,并为该单元编写一堆测试以详尽地涵盖它。没有架构 ID 或您可以验证的任何内容都在路线上。如果您绝对必须检查每条路由的确切架构,只需编写一个函数,该函数采用路由并对其执行多个单元测试。
      猜你喜欢
      • 2018-09-24
      • 2013-10-19
      • 1970-01-01
      • 2019-10-10
      • 2020-05-30
      • 2018-05-25
      • 2018-07-25
      • 2015-04-29
      • 2015-07-01
      相关资源
      最近更新 更多