Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

✨ JSON schema matcher for Jest

License

NotificationsYou must be signed in to change notification settings

americanexpress/jest-json-schema

Repository files navigation

npm versionBuild StatusMentioned in Awesome Jest

JSON schema matcher forjest

Want to get paid for your contributions tojest-json-schema?Send your resume tooneamex.careers@aexp.com

Matchers included

toMatchSchema(schema)

Validates that an object matches the givenJSON schema

it('validates my json',()=>{constschema={properties:{hello:{type:'string'},},required:['hello'],};expect({hello:'world'}).toMatchSchema(schema);});

Installation

$ npm install --save-dev jest-json-schema

Usage

In any test file:

import{matchers}from'jest-json-schema';expect.extend(matchers);

Or if you want it available for all test files then set it up the same way in atest framework script file

You can passAjv options usingmatchersWithOptions and passing it your options object. The only option passedby default isallErrors: true.

import{matchersWithOptions}from'jest-json-schema';constformats={bcp47:/^[a-z]{2}-[A-Z]{2}$/,}expect.extend(matchersWithOptions({ formats}));

Additionally you can also use a callback to further configure and extendthe Ajv instance used by the matchers:

importajvKeywordsfrom'ajv-keywords';import{matchersWithOptions}from'jest-json-schema';constformats={bcp47:/^[a-z]{2}-[A-Z]{2}$/,}expect.extend(matchersWithOptions({ formats},(ajv)=>{// This uses the `ajv-keywords` library to add pre-made// custom keywords to the Ajv instance.ajvKeywords(ajv,['typeof','instanceof']);}));

You can also customize theAjv class with theAjvClass option:

importAjv2020from'ajv/dist/2020'import{matchersWithOptions}from'jest-json-schema';expect.extend(matchersWithOptions({AjvClass:Ajv2020}));

Verbose errors

Ajv supports a verbose option flag which enables more information about individualerrors. This extra information can mean that we can output to Jest more meaningfulerrors that can help the development process:

const{ matchersWithOptions}=require('jest-json-schema');expect.extend(matchersWithOptions({verbose:true}));test('check that property errors are outputted',()=>{constschema={$id:'testSchema',type:'object',properties:{name:{type:'string',},dob:{type:'string',format:'date',},},};constinvalidData={name:null,dob:'02-29-2000',};expect(()=>{expect(invalidData).toMatchSchema(schema)}).toThrowErrorMatchingInlineSnapshot(`"expect(received).toMatchSchema(schema)Received:  .name should be string    Received: <null>    Path: testSchema#/properties/name/type  .dob should match format \\"date\\"    Received: <string> 02-29-2000    Path: testSchema#/properties/dob/format"`);});

Example using multiple schema files

If you organise your schemas into separate files and use refs which point to thevarious different schemas, it will be important to include those dependentschema files when extending Jest'sexpect handler, using thematchersWithOptionsinterface:

schemaA.json

{"$id":"schemaA","$schema":"http://json-schema.org/draft-07/schema#","description":"Example of a definition schema.","definitions": {"testA": {"type":"number","const":1    },"testB": {"type": ["null","string"]    }  }}

schemaB.json

{"$id":"schemaB","$schema":"http://json-schema.org/draft-07/schema#","description":"Example of a schema that references another schema.","$ref":"schemaA#/definitions/testB"}

schemaA.test.js

const{ matchersWithOptions}=require('jest-json-schema');// Local schema files are imported like normal. If you use TypeScript you// will need to ensure `--resolveJsonModule` is enabled.constschemaA=require('./schemaA.json');constschemaB=require('./schemaB.json');expect.extend(matchersWithOptions({// Loading in a schema which is comprised only of definitions,// which means specific test schemas need to be created.// This is good for testing specific conditions for definition schemas.schemas:[schemaA]});test('schemaA is valid',()=>{expect(schemaA).toBeValidSchema();});test('using schemaA to build a test schema to test a specific definition',()=>{// This is a test schema which references a definition in one of the// pre-loaded schemas. This can allow us to write tests for specific// definitions.consttestSchema={$ref:'schemaA#/definitions/testA'};expect(testSchema).toBeValidSchema();// Validexpect(1).toMatchSchema(testSchema);// This example runs through a number of values that we know don't match// the schema, ensuring that any future changes to the schema will require// the test to be updated.['1',true,false,null,[],{}].forEach(value=>{expect(value).not.toMatchSchema(testSchema);});});test('using schemaB which already references a definition in schemaA',()=>{expect(schemaB).toBeValidSchema();// Valid['','1',null].forEach(value=>{expect(value).toMatchSchema(schemaB);});// Invalid['1',true,false,[],{}].forEach(value=>{expect(value).not.toMatchSchema(schemaB);});});

TypeScript support

If you would like to usejest-json-schema library in your TypeScript project, remember to install type definitions from@types/jest-json-schema package.

npm install --save-dev @types/jest-json-schema

Or ifyarn is your package manager of choice:

yarn add @types/jest-json-schema --dev

Contributing

We welcome Your interest in the American Express Open Source Community on Github.Any Contributor to any Open Source Project managed by the American Express OpenSource Community must accept and sign an Agreement indicating agreement to theterms below. Except for the rights granted in this Agreement to American Expressand to recipients of software distributed by American Express, You reserve allright, title, and interest, if any, in and to Your Contributions. Pleasefillout the Agreement.

Please feel free to open pull requests and seeCONTRIBUTING.md to learn how to get started contributing.

License

Any contributions made under this project will be governed by theApache License2.0.

Code of Conduct

This project adheres to theAmerican Express Community Guidelines.By participating, you are expected to honor these guidelines.

About

✨ JSON schema matcher for Jest

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors17


[8]ページ先頭

©2009-2025 Movatter.jp