chai-json-schema
使用斷言來驗證值是否符合 JSON Schema v4 的 Chai 外掛。
如需 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 和瀏覽器全域變數。您可能需要 shim tv4
的全域變數,並確保 jsonpointer.js
可以被 require 為 '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
驗證呼叫,以啟用 對循環物件的支援。它允許 tv4 驗證一般的 JavaScript 結構(而非純 JSON),而不會有在循環參照上進入迴圈的風險。
chai.tv4.cyclicCheck = true;
這比一般驗證慢一些,因此預設為停用。
禁止未知的屬性
chai.tv4.banUnknown = true;
傳遞到內部的 tv4
驗證呼叫,讓驗證在遇到未知的 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 授權條款下授權。