如果对象不包含任何其他属性,请与 Chai 核实

Check with Chai if an object doesn't contain any additional properties

我正在研究 API 并且应该 return 基于权限仅实际对象属性的一个子集。我正在用 mocha 和 chai 编写测试,想测试这样的东西(假设 res 是来自服务器的响应对象,res.body 包含接收到的 JSON 数据):

res.body.should.not.contain.properties.except(['prop1', 'prop2.subprop'])

在这种情况下 res.body.prop1 可以是任何类型的对象,并且 res.body.prop2 只允许包含 属性 subprop - 这又可以是任何类型的对象。

现在,我可以编写自定义函数来测试它,但我认为其他人已经遇到了类似的问题,并且可能有 chai 的扩展或者我可以使用的其他库。

开箱即用,我不认为 Chai 提供了一种构建这样的查询的方法。但是,JSON Schema is a perfect fit for testing if an object matches a certain format. Luckily, a Chai JSON Schema Plugin 存在。使用它,结果如下所示:

chai.use(require('chai-json-schema'));
var bodySchema = {
    title: 'response body',
    type: 'object',
    required: ['prop1', 'prop2'],
    additionalProperties: false,
    properties: {
        prop1: {},
        prop2: {
            type: 'object',
            required: ['subprop'],
            additionalProperties: false,
            properties: {
                subprop: {}
            }
        }
    }
};
res.body.should.be.jsonSchema(bodySchema);

简短说明:

  • required 属性 采用一组必需的属性。如果 prop1prop2 实际上是可选的,请将它们从该数组中删除(或将其全部删除)。
  • additionalProperties: false 确保除 properties 散列中定义的属性外,不允许使用其他属性。
  • prop2包含子模式,可以包含与根模式相同的字段,并指定子模式的格式-属性.

诚然,这些模式可能会变得有点大,但您的验证函数也会变得有点大。当然,您可以将架构设为真正的 JSON 文件,以将其与其余代码分开。