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 许可证授权。
