chai-json-schema

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

使用斷言來驗證值是否符合 JSON Schema v4Chai 外掛。

使用豐富的 驗證術語範例)來斷言簡單值和複雜物件。

如需 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 和瀏覽器全域變數。您可能需要 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 授權條款下授權。

Bitdeli Badge