chai-json-schema

npm: build:? dependencies:? dependencies:? devDependencies:?

Chai 插件,用于断言值是否符合 JSON Schema v4

使用丰富的 验证术语 (示例) 断言简单值和复杂对象。

有关 json-schema 的一般帮助,请参阅此优秀的 指南 和可用的 参考

注意

JSON Schema 验证由 Tiny Validator tv4 完成。

似乎 tv4 已经不再积极开发,也不支持 draft-04 之后的 JSON schema 版本。但是,此 chai 插件将在可预见的将来使用 tv4 作为其后端。如果您想要使用更新版本的 JSON-schema 或更高的性能,您可以考虑结合使用 ajvchai-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.jsTiny Validator tv4Chai 之后包含 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 许可证授权。

Bitdeli Badge