chai-json-schema
Chai 插件,用于断言值是否符合 JSON Schema v4。
有关 json-schema 的一般帮助,请参阅此优秀的 指南 和可用的 参考。
注意
JSON Schema 验证由 Tiny Validator tv4 完成。
似乎 tv4 已经不再积极开发,也不支持 draft-04 之后的 JSON schema 版本。但是,此 chai 插件将在可预见的将来使用 tv4 作为其后端。如果您想要使用更新版本的 JSON-schema 或更高的性能,您可以考虑结合使用 ajv 和 chai-json-schema-ajv
如果 schema 使用 $ref
引用在断言调用之前未添加的 schema,则断言将失败。使用 chai.tv4.addSchema(uri, schema)
预设 schema。
JSON Schema 的主要用例是验证 JSON 文档和 API 响应,但它也是描述和验证任何 JavaScript 值或对象的有力方法。
用法
服务器端
从 npm 安装
$ npm install chai-json-schema
让 chai 使用 chai-json-schema 模块
var chai = require('chai');
chai.use(require('chai-json-schema'));
浏览器端
使用全局变量
在 jsonpointer.js、Tiny Validator tv4 和 Chai 之后包含 chai-json-schema
<script src="jsonpointer.js"></script>
<script src="tv4.js"></script>
<script src="chai.js"></script>
<script src="chai-json-schema.js"></script>
从 bower 安装
$ bower install chai-json-schema
该模块支持 CommonJS、AMD 和浏览器全局变量。您可能需要屏蔽 tv4
的全局变量,并确保 jsonpointer.js
可以作为 'jsonpointer'
要求。
断言
jsonSchema(value, schema)
验证给定的 javascript 值是否符合指定的 JSON Schema。值和 schema 都可能是从外部数据源加载的 JSON,但也可以是文字或对象实例。
var goodApple = {
skin: 'thin',
colors: ['red', 'green', 'yellow'],
taste: 10
};
var badApple = {
colors: ['brown'],
taste: 0,
worms: 2
};
var fruitSchema = {
title: 'fresh fruit schema v1',
type: 'object',
required: ['skin', 'colors', 'taste'],
properties: {
colors: {
type: 'array',
minItems: 1,
uniqueItems: true,
items: {
type: 'string'
}
},
skin: {
type: 'string'
},
taste: {
type: 'number',
minimum: 5
}
}
};
//bdd style
expect(goodApple).to.be.jsonSchema(fruitSchema);
expect(badApple).to.not.be.jsonSchema(fruitSchema);
goodApple.should.be.jsonSchema(fruitSchema);
badApple.should.not.be.jsonSchema(fruitSchema);
//tdd style
assert.jsonSchema(goodApple, fruitSchema);
assert.notJsonSchema(badApple, fruitSchema);
附加 API
tv4
实例被 ‘导出’ 为 chai.tv4
,可以访问它来添加用于验证的 schema。
chai.tv4.addSchema(uri, schema);
还有其他有用的方法
var list = chai.tv4.getMissingUris();
var list = chai.tv4.getMissingUris(/^https?:/);
var list = chai.tv4.getSchemaUris();
var list = chai.tv4.getSchemaUris(/example.com/);
var schema = chai.tv4.getSchema('http://example.com/item');
var schema = chai.tv4.getSchema('http://example.com/item/#sub/type');
chai.tv4.dropSchemas();
有关更多 API 方法和验证器的信息,请参阅 tv4 文档。
非标准 tv4 属性
循环对象
这将传递给内部 tv4
validate 调用,以启用 对循环对象的支持。它允许 tv4 验证正常的 javascript 结构(而不是纯 JSON),而不会冒循环引用导致循环的风险。
chai.tv4.cyclicCheck = true;
这比常规验证略慢,因此默认情况下已禁用。
禁止未知属性
chai.tv4.banUnknown = true;
传递给内部 tv4
validate 调用,使验证在未知 schema 属性上失败。使用它来确保您的 schema 不包含不需要的数据。
验证多个错误
chai.tv4.multiple = true;
调用 tv4.validateMultiple
进行验证,而不是 tv4.validateResult
。如果您想查看所有验证错误,请使用此方法。
远程引用
由于断言的同步性质,在验证期间将不支持动态加载远程引用。
使用您喜欢的测试运行器的异步准备功能预加载远程 schema
// simplified example using a bdd-style async before();
// as used in mocha, jasmine etc.
before(function (done) {
// iterate missing
var checkMissing = function (callback) {
var missing = chai.tv4.getMissingUris();
if (missing.length === 0) {
// all $ref's solved
callback();
return;
}
// load a schema using your favourite JSON loader
// (jQuery, request, SuperAgent etc)
var uri = missing.pop();
myFavoriteJsonLoader.load(uri, function (err, schema) {
if (err || !schema) {
callback(err || 'no data loaded');
return;
}
// add it
chai.tv4.addSchema(uri, schema);
// iterate
checkMissing(callback);
});
};
// load first instance manually
myFavoriteJsonLoader.load(uri, function (err, schema) {
if (err || !schema) {
done(err || 'no data loaded');
return;
}
// add it
chai.tv4.addSchema(uri, schema);
// start checking
checkMissing(done);
});
});
历史记录
查看 发布版本。
构建
在您的 git 签出中安装开发依赖项
$ npm install
您需要全局的 grunt 命令
$ npm install grunt-cli -g
构建并运行测试
$ grunt
查看 Gruntfile
以获取其他命令。
许可证
版权所有 (c) 2013 Bart van der Schoor
根据 MIT 许可证授权。