如果对象不包含任何其他属性,请与 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
属性 采用一组必需的属性。如果 prop1
或 prop2
实际上是可选的,请将它们从该数组中删除(或将其全部删除)。
additionalProperties: false
确保除 properties
散列中定义的属性外,不允许使用其他属性。
prop2
包含子模式,可以包含与根模式相同的字段,并指定子模式的格式-属性.
诚然,这些模式可能会变得有点大,但您的验证函数也会变得有点大。当然,您可以将架构设为真正的 JSON 文件,以将其与其余代码分开。
我正在研究 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
属性 采用一组必需的属性。如果prop1
或prop2
实际上是可选的,请将它们从该数组中删除(或将其全部删除)。additionalProperties: false
确保除properties
散列中定义的属性外,不允许使用其他属性。prop2
包含子模式,可以包含与根模式相同的字段,并指定子模式的格式-属性.
诚然,这些模式可能会变得有点大,但您的验证函数也会变得有点大。当然,您可以将架构设为真正的 JSON 文件,以将其与其余代码分开。