如果对象不包含任何其他属性,请与Chai一起检查

时间:2015-03-12 15:46:47

标签: node.js mocha bdd chai

我正在使用API​​,并且应该仅根据权限返回实际对象属性的子集。我在mocha和chai中编写我的测试,并希望测试这样的事情(给定res是来自服务器的响应对象,res.body包含接收到的JSON数据):

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

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

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

1 个答案:

答案 0 :(得分:1)

开箱即用,我不认为Chai提供了一种构建这样的查询的方法。但是,JSON Schema非常适合测试对象是否与特定格式匹配。幸运的是,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文件,以将其与其余代码分开。