Menu
Open source

Functional testing

Most basic integration test

JavaScript
import http from 'k6/http';
import { describe, expect } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js';

export const options = {
  thresholds: {
    checks: ['rate == 1.00'],
  },
};

export default function () {
  describe('Hello world!', () => {
    const response = http.get('https://test-api.k6.io/public/crocodiles/');

    expect(response.status, 'response status').to.equal(200);
    expect(response).to.have.validJsonBody();
    expect(response.json(), 'croc list').to.be.an('array');
  });
}

Sample integration test

This test goes through several steps. It creates a new user account, authenticates, and interacts with protected resources.

JavaScript
import chai, { describe, expect } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js';
import { Httpx, Get } from 'https://jslib.k6.io/httpx/0.0.6/index.js';
import { randomString } from 'https://jslib.k6.io/k6-utils/1.0.0/index.js';

chai.config.logFailures = true;

export let options = {
  thresholds: {
    // fail the test if any checks fail or any requests fail
    checks: ['rate == 1.00'],
    http_req_failed: ['rate == 0.00'],
  },
  vus: 1,
  iterations: 1,
};

let session = new Httpx({ baseURL: 'https://test-api.k6.io' });

function retrieveIndividualCrocodilesInABatch() {
  describe('[Crocs service] Fetch public crocs one by one', () => {
    let responses = session.batch([
      new Get('/public/crocodiles/1/'),
      new Get('/public/crocodiles/2/'),
      new Get('/public/crocodiles/3/'),
    ]);

    expect(responses, 'responses').to.be.an('array');

    responses.forEach((response) => {
      expect(response.status, 'response status').to.equal(200);
      expect(response).to.have.validJsonBody();
      expect(response.json(), 'crocodile').to.be.an('object');
      expect(response.json(), 'crocodile').to.include.keys('age', 'name', 'id', 'sex');
      expect(response.json(), 'crocodile').to.not.have.a.property('outfit');
    });
  });
}

function retrieveAllPublicCrocodiles() {
  describe('[Crocs service] Fetch a list of crocs', () => {
    let response = session.get('/public/crocodiles');

    expect(response.status, 'response status').to.equal(200);
    expect(response).to.have.validJsonBody();
    expect(response.json(), 'croc list').to.be.an('array').lengthOf.above(5);
  });
}

function validateAuthService() {
  const USERNAME = `${randomString(10)}@example.com`;
  const PASSWORD = 'superCroc2021';

  describe('[Registration service] user registration', () => {
    let sampleUser = {
      username: USERNAME,
      password: PASSWORD,
      email: USERNAME,
      first_name: 'John',
      last_name: 'Smith',
    };

    let response = session.post(`/user/register/`, sampleUser);

    expect(response.status, 'registration status').to.equal(201);
    expect(response).to.have.validJsonBody();
  });

  describe('[Auth service] user authentication', () => {
    let authData = {
      username: USERNAME,
      password: PASSWORD,
    };

    let resp = session.post(`/auth/token/login/`, authData);

    expect(resp.status, 'Auth status').to.be.within(200, 204);
    expect(resp).to.have.validJsonBody();
    expect(resp.json()).to.have.a.property('access');
    expect(resp.json('access'), 'auth token').to.be.a('string');

    let authToken = resp.json('access');
    // set the authorization header on the session for the subsequent requests.
    session.addHeader('Authorization', `Bearer ${authToken}`);
  });
}

function validateCrocodileCreation() {
  // authentication happened before this call.

  describe('[Croc service] Create a new crocodile', () => {
    let payload = {
      name: `Croc Name`,
      sex: 'M',
      date_of_birth: '2019-01-01',
    };

    let resp = session.post(`/my/crocodiles/`, payload);

    expect(resp.status, 'Croc creation status').to.equal(201);
    expect(resp).to.have.validJsonBody();

    session.newCrocId = resp.json('id'); // caching croc ID for the future.
  });

  describe('[Croc service] Fetch private crocs', () => {
    let response = session.get('/my/crocodiles/');

    expect(response.status, 'response status').to.equal(200);
    expect(response, 'private crocs').to.have.validJsonBody();
    expect(response.json(), 'private crocs').to.not.be.empty;
  });
}

export default function testSuite() {
  retrieveIndividualCrocodilesInABatch();
  retrieveAllPublicCrocodiles();
  validateAuthService();
  validateCrocodileCreation();
}

Full example showcasing all functionality

Here’s an auto-generated k6 test script showcasing all examples from the Chaijs API documentation.

JavaScript
import { describe, expect, chai } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js';

chai.config.aggregateChecks = false;
chai.config.logFailures = true;

export default function testSuite() {
  describe('docs example 0', () => {
    expect(function () {}).to.not.throw();
    expect({ a: 1 }).to.not.have.property('b');
    expect([1, 2]).to.be.an('array').that.does.not.include(3);
  });

  describe('docs example 1', () => {
    expect(2).to.equal(2); // Recommended
    expect(2).to.not.equal(1); // Not recommended
  });

  describe('docs example 2', () => {
    // Target object deeply (but not strictly) equals `{a: 1}`
    expect({ a: 1 }).to.deep.equal({ a: 1 });
    expect({ a: 1 }).to.not.equal({ a: 1 });

    // Target array deeply (but not strictly) includes `{a: 1}`
    expect([{ a: 1 }]).to.deep.include({ a: 1 });
    expect([{ a: 1 }]).to.not.include({ a: 1 });

    // Target object deeply (but not strictly) includes `x: {a: 1}`
    expect({ x: { a: 1 } }).to.deep.include({ x: { a: 1 } });
    expect({ x: { a: 1 } }).to.not.include({ x: { a: 1 } });

    // Target array deeply (but not strictly) has member `{a: 1}`
    expect([{ a: 1 }]).to.have.deep.members([{ a: 1 }]);
    expect([{ a: 1 }]).to.not.have.members([{ a: 1 }]);

    // Target set deeply (but not strictly) has key `{a: 1}`
    expect(new Set([{ a: 1 }])).to.have.deep.keys([{ a: 1 }]);
    expect(new Set([{ a: 1 }])).to.not.have.keys([{ a: 1 }]);

    // Target object deeply (but not strictly) has property `x: {a: 1}`
    expect({ x: { a: 1 } }).to.have.deep.property('x', { a: 1 });
    expect({ x: { a: 1 } }).to.not.have.property('x', { a: 1 });
  });

  describe('docs example 3', () => {
    expect({ a: { b: ['x', 'y'] } }).to.have.nested.property('a.b[1]');
    expect({ a: { b: ['x', 'y'] } }).to.nested.include({ 'a.b[1]': 'y' });
  });

  describe('docs example 4', () => {
    expect({ '.a': { '[b]': 'x' } }).to.have.nested.property('\\.a.\\[b\\]');
    expect({ '.a': { '[b]': 'x' } }).to.nested.include({ '\\.a.\\[b\\]': 'x' });
  });

  describe('docs example 5', () => {
    Object.prototype.b = 2;

    expect({ a: 1 }).to.have.own.property('a');
    expect({ a: 1 }).to.have.property('b');
    expect({ a: 1 }).to.not.have.own.property('b');

    expect({ a: 1 }).to.own.include({ a: 1 });
    expect({ a: 1 }).to.include({ b: 2 }).but.not.own.include({ b: 2 });
  });

  describe('docs example 6', () => {
    expect([1, 2]).to.have.ordered.members([1, 2]).but.not.have.ordered.members([2, 1]);
  });

  describe('docs example 7', () => {
    expect([1, 2, 3]).to.include.ordered.members([1, 2]).but.not.include.ordered.members([2, 3]);
  });

  describe('docs example 8', () => {
    expect({ a: 1, b: 2 }).to.not.have.any.keys('c', 'd');
  });

  describe('docs example 9', () => {
    expect({ a: 1, b: 2 }).to.have.all.keys('a', 'b');
  });

  describe('docs example 10', () => {
    expect('foo').to.be.a('string');
    expect({ a: 1 }).to.be.an('object');
    expect(null).to.be.a('null');
    expect(undefined).to.be.an('undefined');
    expect(new Error()).to.be.an('error');
    expect(Promise.resolve()).to.be.a('promise');
    expect(new Float32Array()).to.be.a('float32array');
    expect(Symbol()).to.be.a('symbol');
  });

  describe('docs example 11', () => {
    var myObj = {
      [Symbol.toStringTag]: 'myCustomType',
    };

    expect(myObj).to.be.a('myCustomType').but.not.an('object');
  });

  describe('docs example 12', () => {
    expect([1, 2, 3]).to.be.an('array').that.includes(2);
    expect([]).to.be.an('array').that.is.empty;
  });

  describe('docs example 13', () => {
    expect('foo').to.be.a('string'); // Recommended
    expect('foo').to.not.be.an('array'); // Not recommended
  });

  describe('docs example 14', () => {
    expect(1).to.be.a('string', 'nooo why fail??');
    expect(1, 'nooo why fail??').to.be.a('string');
  });

  describe('docs example 15', () => {
    expect({ b: 2 }).to.have.a.property('b');
  });

  describe('docs example 16', () => {
    expect('foobar').to.include('foo');
  });

  describe('docs example 17', () => {
    expect([1, 2, 3]).to.include(2);
  });

  describe('docs example 18', () => {
    expect({ a: 1, b: 2, c: 3 }).to.include({ a: 1, b: 2 });
  });

  describe('docs example 19', () => {
    expect(new Set([1, 2])).to.include(2);
  });

  describe('docs example 20', () => {
    expect(
      new Map([
        ['a', 1],
        ['b', 2],
      ])
    ).to.include(2);
  });

  describe('docs example 21', () => {
    expect([1, 2, 3]).to.be.an('array').that.includes(2);
  });

  describe('docs example 22', () => {
    // Target array deeply (but not strictly) includes `{a: 1}`
    expect([{ a: 1 }]).to.deep.include({ a: 1 });
    expect([{ a: 1 }]).to.not.include({ a: 1 });

    // Target object deeply (but not strictly) includes `x: {a: 1}`
    expect({ x: { a: 1 } }).to.deep.include({ x: { a: 1 } });
    expect({ x: { a: 1 } }).to.not.include({ x: { a: 1 } });
  });

  describe('docs example 23', () => {
    Object.prototype.b = 2;

    expect({ a: 1 }).to.own.include({ a: 1 });
    expect({ a: 1 }).to.include({ b: 2 }).but.not.own.include({ b: 2 });
  });

  describe('docs example 24', () => {
    expect({ a: { b: 2 } }).to.deep.own.include({ a: { b: 2 } });
  });

  describe('docs example 25', () => {
    expect({ a: { b: ['x', 'y'] } }).to.nested.include({ 'a.b[1]': 'y' });
  });

  describe('docs example 26', () => {
    expect({ '.a': { '[b]': 2 } }).to.nested.include({ '\\.a.\\[b\\]': 2 });
  });

  describe('docs example 27', () => {
    expect({ a: { b: [{ c: 3 }] } }).to.deep.nested.include({ 'a.b[0]': { c: 3 } });
  });

  describe('docs example 28', () => {
    expect('foobar').to.not.include('taco');
    expect([1, 2, 3]).to.not.include(4);
  });

  describe('docs example 29', () => {
    expect({ c: 3 }).to.not.have.any.keys('a', 'b'); // Recommended
    expect({ c: 3 }).to.not.include({ a: 1, b: 2 }); // Not recommended
  });

  describe('docs example 30', () => {
    expect({ a: 3, b: 4 }).to.include({ a: 3, b: 4 }); // Recommended
    expect({ a: 3, b: 4 }).to.not.include({ a: 1, b: 2 }); // Not recommended
  });

  describe('docs example 31', () => {
    expect([1, 2, 3]).to.include(4, 'nooo why fail??');
    expect([1, 2, 3], 'nooo why fail??').to.include(4);
  });

  describe('docs example 32', () => {
    // Target object's keys are a superset of ['a', 'b'] but not identical
    expect({ a: 1, b: 2, c: 3 }).to.include.all.keys('a', 'b');
    expect({ a: 1, b: 2, c: 3 }).to.not.have.all.keys('a', 'b');

    // Target array is a superset of [1, 2] but not identical
    expect([1, 2, 3]).to.include.members([1, 2]);
    expect([1, 2, 3]).to.not.have.members([1, 2]);

    // Duplicates in the subset are ignored
    expect([1, 2, 3]).to.include.members([1, 2, 2, 2]);
  });

  describe('docs example 33', () => {
    // Both assertions are identical
    expect({ a: 1 }).to.include.any.keys('a', 'b');
    expect({ a: 1 }).to.have.any.keys('a', 'b');
  });

  describe('docs example 34', () => {
    expect(1).to.equal(1); // Recommended
    expect(1).to.be.ok; // Not recommended

    expect(true).to.be.true; // Recommended
    expect(true).to.be.ok; // Not recommended
  });

  describe('docs example 35', () => {
    expect(0).to.equal(0); // Recommended
    expect(0).to.not.be.ok; // Not recommended

    expect(false).to.be.false; // Recommended
    expect(false).to.not.be.ok; // Not recommended

    expect(null).to.be.null; // Recommended
    expect(null).to.not.be.ok; // Not recommended

    expect(undefined).to.be.undefined; // Recommended
    expect(undefined).to.not.be.ok; // Not recommended
  });

  describe('docs example 36', () => {
    expect(false, 'nooo why fail??').to.be.ok;
  });

  describe('docs example 37', () => {
    expect(true).to.be.true;
  });

  describe('docs example 38', () => {
    expect(false).to.be.false; // Recommended
    expect(false).to.not.be.true; // Not recommended

    expect(1).to.equal(1); // Recommended
    expect(1).to.not.be.true; // Not recommended
  });

  describe('docs example 39', () => {
    expect(false, 'nooo why fail??').to.be.true;
  });

  describe('docs example 40', () => {
    expect(false).to.be.false;
  });

  describe('docs example 41', () => {
    expect(true).to.be.true; // Recommended
    expect(true).to.not.be.false; // Not recommended

    expect(1).to.equal(1); // Recommended
    expect(1).to.not.be.false; // Not recommended
  });

  describe('docs example 42', () => {
    expect(true, 'nooo why fail??').to.be.false;
  });

  describe('docs example 43', () => {
    expect(null).to.be.null;
  });

  describe('docs example 44', () => {
    expect(1).to.equal(1); // Recommended
    expect(1).to.not.be.null; // Not recommended
  });

  describe('docs example 45', () => {
    expect(42, 'nooo why fail??').to.be.null;
  });

  describe('docs example 46', () => {
    expect(undefined).to.be.undefined;
  });

  describe('docs example 47', () => {
    expect(1).to.equal(1); // Recommended
    expect(1).to.not.be.undefined; // Not recommended
  });

  describe('docs example 48', () => {
    expect(42, 'nooo why fail??').to.be.undefined;
  });

  describe('docs example 49', () => {
    expect(NaN).to.be.NaN;
  });

  describe('docs example 50', () => {
    expect('foo').to.equal('foo'); // Recommended
    expect('foo').to.not.be.NaN; // Not recommended
  });

  describe('docs example 51', () => {
    expect(42, 'nooo why fail??').to.be.NaN;
  });

  describe('docs example 52', () => {
    expect(1).to.equal(1); // Recommended
    expect(1).to.exist; // Not recommended

    expect(0).to.equal(0); // Recommended
    expect(0).to.exist; // Not recommended
  });

  describe('docs example 53', () => {
    expect(null).to.be.null; // Recommended
    expect(null).to.not.exist; // Not recommended

    expect(undefined).to.be.undefined; // Recommended
    expect(undefined).to.not.exist; // Not recommended
  });

  describe('docs example 54', () => {
    expect(null, 'nooo why fail??').to.exist;
  });

  describe('docs example 55', () => {
    expect([]).to.be.empty;
    expect('').to.be.empty;
  });

  describe('docs example 56', () => {
    expect(new Set()).to.be.empty;
    expect(new Map()).to.be.empty;
  });

  describe('docs example 57', () => {
    expect({}).to.be.empty;
  });

  describe('docs example 58', () => {
    expect([]).to.be.an('array').that.is.empty;
  });

  describe('docs example 59', () => {
    expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
    expect([1, 2, 3]).to.not.be.empty; // Not recommended

    expect(new Set([1, 2, 3])).to.have.property('size', 3); // Recommended
    expect(new Set([1, 2, 3])).to.not.be.empty; // Not recommended

    expect(Object.keys({ a: 1 })).to.have.lengthOf(1); // Recommended
    expect({ a: 1 }).to.not.be.empty; // Not recommended
  });

  describe('docs example 60', () => {
    expect([1, 2, 3], 'nooo why fail??').to.be.empty;
  });

  describe('docs example 61', () => {
    function test() {
      expect(arguments).to.be.arguments;
    }

    test();
  });

  describe('docs example 62', () => {
    expect('foo').to.be.a('string'); // Recommended
    expect('foo').to.not.be.arguments; // Not recommended
  });

  describe('docs example 63', () => {
    expect({}, 'nooo why fail??').to.be.arguments;
  });

  describe('docs example 64', () => {
    expect(1).to.equal(1);
    expect('foo').to.equal('foo');
  });

  describe('docs example 65', () => {
    // Target object deeply (but not strictly) equals `{a: 1}`
    expect({ a: 1 }).to.deep.equal({ a: 1 });
    expect({ a: 1 }).to.not.equal({ a: 1 });

    // Target array deeply (but not strictly) equals `[1, 2]`
    expect([1, 2]).to.deep.equal([1, 2]);
    expect([1, 2]).to.not.equal([1, 2]);
  });

  describe('docs example 66', () => {
    expect(1).to.equal(1); // Recommended
    expect(1).to.not.equal(2); // Not recommended
  });

  describe('docs example 67', () => {
    expect(1).to.equal(2, 'nooo why fail??');
    expect(1, 'nooo why fail??').to.equal(2);
  });

  describe('docs example 68', () => {
    // Target object is deeply (but not strictly) equal to {a: 1}
    expect({ a: 1 }).to.eql({ a: 1 }).but.not.equal({ a: 1 });

    // Target array is deeply (but not strictly) equal to [1, 2]
    expect([1, 2]).to.eql([1, 2]).but.not.equal([1, 2]);
  });

  describe('docs example 69', () => {
    expect({ a: 1 }).to.eql({ a: 1 }); // Recommended
    expect({ a: 1 }).to.not.eql({ b: 2 }); // Not recommended
  });

  describe('docs example 70', () => {
    expect({ a: 1 }).to.eql({ b: 2 }, 'nooo why fail??');
    expect({ a: 1 }, 'nooo why fail??').to.eql({ b: 2 });
  });

  describe('docs example 71', () => {
    expect(2).to.equal(2); // Recommended
    expect(2).to.be.above(1); // Not recommended
  });

  describe('docs example 72', () => {
    expect('foo').to.have.lengthOf(3); // Recommended
    expect('foo').to.have.lengthOf.above(2); // Not recommended

    expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
    expect([1, 2, 3]).to.have.lengthOf.above(2); // Not recommended
  });

  describe('docs example 73', () => {
    expect(2).to.equal(2); // Recommended
    expect(1).to.not.be.above(2); // Not recommended
  });

  describe('docs example 74', () => {
    expect(1).to.be.above(2, 'nooo why fail??');
    expect(1, 'nooo why fail??').to.be.above(2);
  });

  describe('docs example 75', () => {
    expect(2).to.equal(2); // Recommended
    expect(2).to.be.at.least(1); // Not recommended
    expect(2).to.be.at.least(2); // Not recommended
  });

  describe('docs example 76', () => {
    expect('foo').to.have.lengthOf(3); // Recommended
    expect('foo').to.have.lengthOf.at.least(2); // Not recommended

    expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
    expect([1, 2, 3]).to.have.lengthOf.at.least(2); // Not recommended
  });

  describe('docs example 77', () => {
    expect(1).to.equal(1); // Recommended
    expect(1).to.not.be.at.least(2); // Not recommended
  });

  describe('docs example 78', () => {
    expect(1).to.be.at.least(2, 'nooo why fail??');
    expect(1, 'nooo why fail??').to.be.at.least(2);
  });

  describe('docs example 79', () => {
    expect(1).to.equal(1); // Recommended
    expect(1).to.be.below(2); // Not recommended
  });

  describe('docs example 80', () => {
    expect('foo').to.have.lengthOf(3); // Recommended
    expect('foo').to.have.lengthOf.below(4); // Not recommended

    expect([1, 2, 3]).to.have.length(3); // Recommended
    expect([1, 2, 3]).to.have.lengthOf.below(4); // Not recommended
  });

  describe('docs example 81', () => {
    expect(2).to.equal(2); // Recommended
    expect(2).to.not.be.below(1); // Not recommended
  });

  describe('docs example 82', () => {
    expect(2).to.be.below(1, 'nooo why fail??');
    expect(2, 'nooo why fail??').to.be.below(1);
  });

  describe('docs example 83', () => {
    expect(1).to.equal(1); // Recommended
    expect(1).to.be.at.most(2); // Not recommended
    expect(1).to.be.at.most(1); // Not recommended
  });

  describe('docs example 84', () => {
    expect('foo').to.have.lengthOf(3); // Recommended
    expect('foo').to.have.lengthOf.at.most(4); // Not recommended

    expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
    expect([1, 2, 3]).to.have.lengthOf.at.most(4); // Not recommended
  });

  describe('docs example 85', () => {
    expect(2).to.equal(2); // Recommended
    expect(2).to.not.be.at.most(1); // Not recommended
  });

  describe('docs example 86', () => {
    expect(2).to.be.at.most(1, 'nooo why fail??');
    expect(2, 'nooo why fail??').to.be.at.most(1);
  });

  describe('docs example 87', () => {
    expect(2).to.equal(2); // Recommended
    expect(2).to.be.within(1, 3); // Not recommended
    expect(2).to.be.within(2, 3); // Not recommended
    expect(2).to.be.within(1, 2); // Not recommended
  });

  describe('docs example 88', () => {
    expect('foo').to.have.lengthOf.within(2, 4); // Not recommended

    expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
    expect([1, 2, 3]).to.have.lengthOf.within(2, 4); // Not recommended
  });

  describe('docs example 89', () => {
    expect(1).to.equal(1); // Recommended
    expect(1).to.not.be.within(2, 4); // Not recommended
  });

  describe('docs example 90', () => {
    expect(4).to.be.within(1, 3, 'nooo why fail??');
    expect(4, 'nooo why fail??').to.be.within(1, 3);
  });

  describe('docs example 91', () => {
    function Cat() {}

    expect(new Cat()).to.be.an.instanceof(Cat);
    expect([1, 2]).to.be.an.instanceof(Array);
  });

  describe('docs example 92', () => {
    expect({ a: 1 }).to.not.be.an.instanceof(Array);
  });

  describe('docs example 93', () => {
    expect(1).to.be.an.instanceof(Array, 'nooo why fail??');
    expect(1, 'nooo why fail??').to.be.an.instanceof(Array);
  });

  describe('docs example 94', () => {
    expect({ a: 1 }).to.have.property('a');
  });

  describe('docs example 95', () => {
    expect({ a: 1 }).to.have.property('a', 1);
  });

  describe('docs example 96', () => {
    // Target object deeply (but not strictly) has property `x: {a: 1}`
    expect({ x: { a: 1 } }).to.have.deep.property('x', { a: 1 });
    expect({ x: { a: 1 } }).to.not.have.property('x', { a: 1 });
  });

  describe('docs example 97', () => {
    Object.prototype.b = 2;

    expect({ a: 1 }).to.have.own.property('a');
    expect({ a: 1 }).to.have.own.property('a', 1);
    expect({ a: 1 }).to.have.property('b');
    expect({ a: 1 }).to.not.have.own.property('b');
  });

  describe('docs example 98', () => {
    expect({ x: { a: 1 } }).to.have.deep.own.property('x', { a: 1 });
  });

  describe('docs example 99', () => {
    expect({ a: { b: ['x', 'y'] } }).to.have.nested.property('a.b[1]');
    expect({ a: { b: ['x', 'y'] } }).to.have.nested.property('a.b[1]', 'y');
  });

  describe('docs example 100', () => {
    expect({ '.a': { '[b]': 'x' } }).to.have.nested.property('\\.a.\\[b\\]');
  });

  describe('docs example 101', () => {
    expect({ a: { b: [{ c: 3 }] } }).to.have.deep.nested.property('a.b[0]', { c: 3 });
  });

  describe('docs example 102', () => {
    expect({ a: 1 }).to.not.have.property('b');
  });

  describe('docs example 103', () => {
    expect({ b: 2 }).to.not.have.property('a'); // Recommended
    expect({ b: 2 }).to.not.have.property('a', 1); // Not recommended
  });

  describe('docs example 104', () => {
    expect({ a: 3 }).to.have.property('a', 3); // Recommended
    expect({ a: 3 }).to.not.have.property('a', 1); // Not recommended
  });

  describe('docs example 105', () => {
    expect({ a: 1 }).to.have.property('a').that.is.a('number');
  });

  describe('docs example 106', () => {
    // Recommended
    expect({ a: 1 }).to.have.property('a', 2, 'nooo why fail??');
    expect({ a: 1 }, 'nooo why fail??').to.have.property('a', 2);
    expect({ a: 1 }, 'nooo why fail??').to.have.property('b');

    // Not recommended
    expect({ a: 1 }).to.have.property('b', undefined, 'nooo why fail??');
  });

  describe('docs example 107', () => {
    expect({ a: 1 }).to.have.ownPropertyDescriptor('a');
  });

  describe('docs example 108', () => {
    expect({ a: 1 }).to.have.ownPropertyDescriptor('a', {
      configurable: true,
      enumerable: true,
      writable: true,
      value: 1,
    });
  });

  describe('docs example 109', () => {
    expect({ a: 1 }).to.not.have.ownPropertyDescriptor('b');
  });

  describe('docs example 110', () => {
    // Recommended
    expect({ b: 2 }).to.not.have.ownPropertyDescriptor('a');

    // Not recommended
    expect({ b: 2 }).to.not.have.ownPropertyDescriptor('a', {
      configurable: true,
      enumerable: true,
      writable: true,
      value: 1,
    });
  });

  describe('docs example 111', () => {
    // Recommended
    expect({ a: 3 }).to.have.ownPropertyDescriptor('a', {
      configurable: true,
      enumerable: true,
      writable: true,
      value: 3,
    });

    // Not recommended
    expect({ a: 3 }).to.not.have.ownPropertyDescriptor('a', {
      configurable: true,
      enumerable: true,
      writable: true,
      value: 1,
    });
  });

  describe('docs example 112', () => {
    expect({ a: 1 }).to.have.ownPropertyDescriptor('a').that.has.property('enumerable', true);
  });

  describe('docs example 113', () => {
    // Recommended
    expect({ a: 1 }).to.have.ownPropertyDescriptor(
      'a',
      {
        configurable: true,
        enumerable: true,
        writable: true,
        value: 2,
      },
      'nooo why fail??'
    );

    // Recommended
    expect({ a: 1 }, 'nooo why fail??').to.have.ownPropertyDescriptor('a', {
      configurable: true,
      enumerable: true,
      writable: true,
      value: 2,
    });

    // Recommended
    expect({ a: 1 }, 'nooo why fail??').to.have.ownPropertyDescriptor('b');

    // Not recommended
    expect({ a: 1 }).to.have.ownPropertyDescriptor('b', undefined, 'nooo why fail??');
  });

  describe('docs example 114', () => {
    expect([1, 2, 3]).to.have.lengthOf(3);
    expect('foo').to.have.lengthOf(3);
    expect(new Set([1, 2, 3])).to.have.lengthOf(3);
    expect(
      new Map([
        ['a', 1],
        ['b', 2],
        ['c', 3],
      ])
    ).to.have.lengthOf(3);
  });

  describe('docs example 115', () => {
    expect('foo').to.have.lengthOf(3); // Recommended
    expect('foo').to.not.have.lengthOf(4); // Not recommended
  });

  describe('docs example 116', () => {
    expect([1, 2, 3]).to.have.lengthOf(2, 'nooo why fail??');
    expect([1, 2, 3], 'nooo why fail??').to.have.lengthOf(2);
  });

  describe('docs example 117', () => {
    // Recommended
    expect([1, 2, 3]).to.have.lengthOf(3);

    // Not recommended
    expect([1, 2, 3]).to.have.lengthOf.above(2);
    expect([1, 2, 3]).to.have.lengthOf.below(4);
    expect([1, 2, 3]).to.have.lengthOf.at.least(3);
    expect([1, 2, 3]).to.have.lengthOf.at.most(3);
    expect([1, 2, 3]).to.have.lengthOf.within(2, 4);
  });

  describe('docs example 118', () => {
    expect([1, 2, 3]).to.have.a.length(3); // incompatible; throws error
    expect([1, 2, 3]).to.have.a.lengthOf(3); // passes as expected
  });

  describe('docs example 119', () => {
    expect('foobar').to.match(/^foo/);
  });

  describe('docs example 120', () => {
    expect('foobar').to.not.match(/taco/);
  });

  describe('docs example 121', () => {
    expect('foobar').to.match(/taco/, 'nooo why fail??');
    expect('foobar', 'nooo why fail??').to.match(/taco/);
  });

  describe('docs example 122', () => {
    expect('foobar').to.have.string('bar');
  });

  describe('docs example 123', () => {
    expect('foobar').to.not.have.string('taco');
  });

  describe('docs example 124', () => {
    expect('foobar').to.have.string('taco', 'nooo why fail??');
    expect('foobar', 'nooo why fail??').to.have.string('taco');
  });

  describe('docs example 125', () => {
    expect({ a: 1, b: 2 }).to.have.all.keys('a', 'b');
    expect(['x', 'y']).to.have.all.keys(0, 1);

    expect({ a: 1, b: 2 }).to.have.all.keys(['a', 'b']);
    expect(['x', 'y']).to.have.all.keys([0, 1]);

    expect({ a: 1, b: 2 }).to.have.all.keys({ a: 4, b: 5 }); // ignore 4 and 5
    expect(['x', 'y']).to.have.all.keys({ 0: 4, 1: 5 }); // ignore 4 and 5
  });

  describe('docs example 126', () => {
    expect(
      new Map([
        ['a', 1],
        ['b', 2],
      ])
    ).to.have.all.keys('a', 'b');
    expect(new Set(['a', 'b'])).to.have.all.keys('a', 'b');
  });

  describe('docs example 127', () => {
    expect({ a: 1, b: 2 }).to.be.an('object').that.has.all.keys('a', 'b');
  });

  describe('docs example 128', () => {
    // Target set deeply (but not strictly) has key `{a: 1}`
    expect(new Set([{ a: 1 }])).to.have.all.deep.keys([{ a: 1 }]);
    expect(new Set([{ a: 1 }])).to.not.have.all.keys([{ a: 1 }]);
  });

  describe('docs example 129', () => {
    // Recommended; asserts that target doesn't have any of the given keys
    expect({ a: 1, b: 2 }).to.not.have.any.keys('c', 'd');

    // Not recommended; asserts that target doesn't have all of the given
    // keys but may or may not have some of them
    expect({ a: 1, b: 2 }).to.not.have.all.keys('c', 'd');
  });

  describe('docs example 130', () => {
    // Recommended; asserts that target has all the given keys
    expect({ a: 1, b: 2 }).to.have.all.keys('a', 'b');

    // Not recommended; asserts that target has at least one of the given
    // keys but may or may not have more of them
    expect({ a: 1, b: 2 }).to.have.any.keys('a', 'b');
  });

  describe('docs example 131', () => {
    // Both assertions are identical
    expect({ a: 1, b: 2 }).to.have.all.keys('a', 'b'); // Recommended
    expect({ a: 1, b: 2 }).to.have.keys('a', 'b'); // Not recommended
  });

  describe('docs example 132', () => {
    // Target object's keys are a superset of ['a', 'b'] but not identical
    expect({ a: 1, b: 2, c: 3 }).to.include.all.keys('a', 'b');
    expect({ a: 1, b: 2, c: 3 }).to.not.have.all.keys('a', 'b');
  });

  describe('docs example 133', () => {
    // Both assertions are identical
    expect({ a: 1 }).to.have.any.keys('a', 'b');
    expect({ a: 1 }).to.include.any.keys('a', 'b');
  });

  describe('docs example 134', () => {
    expect({ a: 1 }, 'nooo why fail??').to.have.key('b');
  });

  describe('docs example 135', () => {
    var badFn = function () {
      throw new TypeError('Illegal salmon!');
    };

    expect(badFn).to.throw();
  });

  describe('docs example 136', () => {
    var badFn = function () {
      throw new TypeError('Illegal salmon!');
    };

    expect(badFn).to.throw(TypeError);
  });

  describe('docs example 137', () => {
    var err = new TypeError('Illegal salmon!');
    var badFn = function () {
      throw err;
    };

    expect(badFn).to.throw(err);
  });

  describe('docs example 138', () => {
    var badFn = function () {
      throw new TypeError('Illegal salmon!');
    };

    expect(badFn).to.throw('salmon');
  });

  describe('docs example 139', () => {
    var badFn = function () {
      throw new TypeError('Illegal salmon!');
    };

    expect(badFn).to.throw(/salmon/);
  });

  describe('docs example 140', () => {
    var err = new TypeError('Illegal salmon!');
    var badFn = function () {
      throw err;
    };

    expect(badFn).to.throw(TypeError, 'salmon');
    expect(badFn).to.throw(TypeError, /salmon/);
    expect(badFn).to.throw(err, 'salmon');
    expect(badFn).to.throw(err, /salmon/);
  });

  describe('docs example 141', () => {
    var goodFn = function () {};

    expect(goodFn).to.not.throw();
  });

  describe('docs example 142', () => {
    var goodFn = function () {};

    expect(goodFn).to.not.throw(); // Recommended
    expect(goodFn).to.not.throw(ReferenceError, 'x'); // Not recommended
  });

  describe('docs example 143', () => {
    var badFn = function () {
      throw new TypeError('Illegal salmon!');
    };

    expect(badFn).to.throw(TypeError, 'salmon'); // Recommended
    expect(badFn).to.not.throw(ReferenceError, 'x'); // Not recommended
  });

  describe('docs example 144', () => {
    var err = new TypeError('Illegal salmon!');
    err.code = 42;
    var badFn = function () {
      throw err;
    };

    expect(badFn).to.throw(TypeError).with.property('code', 42);
  });

  describe('docs example 145', () => {
    var goodFn = function () {};

    expect(goodFn).to.throw(TypeError, 'x', 'nooo why fail??');
    expect(goodFn, 'nooo why fail??').to.throw();
  });

  describe('docs example 146', () => {
    var fn = function () {
      throw new TypeError('Illegal salmon!');
    };

    expect(fn).to.throw(); // Good! Tests `fn` as desired
    expect(fn()).to.throw(); // Bad! Tests result of `fn()`, not `fn`
  });

  describe('docs example 147', () => {
    expect(function () {
      fn(42);
    }).to.throw(); // Function expression
    expect(() => fn(42)).to.throw(); // ES6 arrow function
  });

  describe('docs example 148', () => {
    expect(function () {
      cat.meow();
    }).to.throw(); // Function expression
    expect(() => cat.meow()).to.throw(); // ES6 arrow function
    expect(cat.meow.bind(cat)).to.throw(); // Bind
  });

  describe('docs example 149', () => {
    function Cat() {}
    Cat.prototype.meow = function () {};

    expect(new Cat()).to.respondTo('meow');
  });

  describe('docs example 150', () => {
    function Cat() {}
    Cat.prototype.meow = function () {};

    expect(Cat).to.respondTo('meow');
  });

  describe('docs example 151', () => {
    function Cat() {}
    Cat.prototype.meow = function () {};
    Cat.hiss = function () {};

    expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow');
  });

  describe('docs example 152', () => {
    function Cat() {}
    Cat.prototype.meow = function () {};

    expect(new Cat()).to.be.an('object').that.respondsTo('meow');
  });

  describe('docs example 153', () => {
    function Dog() {}
    Dog.prototype.bark = function () {};

    expect(new Dog()).to.not.respondTo('meow');
  });

  describe('docs example 154', () => {
    expect({}).to.respondTo('meow', 'nooo why fail??');
    expect({}, 'nooo why fail??').to.respondTo('meow');
  });

  describe('docs example 155', () => {
    function Cat() {}
    Cat.prototype.meow = function () {};
    Cat.hiss = function () {};

    expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow');
  });

  describe('docs example 156', () => {
    expect(1).to.satisfy(function (num) {
      return num > 0;
    });
  });

  describe('docs example 157', () => {
    expect(1).to.not.satisfy(function (num) {
      return num > 2;
    });
  });

  describe('docs example 158', () => {
    expect(1).to.satisfy(function (num) {
      return num > 2;
    }, 'nooo why fail??');

    expect(1, 'nooo why fail??').to.satisfy(function (num) {
      return num > 2;
    });
  });

  describe('docs example 159', () => {
    // Recommended
    expect(1.5).to.equal(1.5);

    // Not recommended
    expect(1.5).to.be.closeTo(1, 0.5);
    expect(1.5).to.be.closeTo(2, 0.5);
    expect(1.5).to.be.closeTo(1, 1);
  });

  describe('docs example 160', () => {
    expect(1.5).to.equal(1.5); // Recommended
    expect(1.5).to.not.be.closeTo(3, 1); // Not recommended
  });

  describe('docs example 161', () => {
    expect(1.5).to.be.closeTo(3, 1, 'nooo why fail??');
    expect(1.5, 'nooo why fail??').to.be.closeTo(3, 1);
  });

  describe('docs example 162', () => {
    expect([1, 2, 3]).to.have.members([2, 1, 3]);
    expect([1, 2, 2]).to.have.members([2, 1, 2]);
  });

  describe('docs example 163', () => {
    // Target array deeply (but not strictly) has member `{a: 1}`
    expect([{ a: 1 }]).to.have.deep.members([{ a: 1 }]);
    expect([{ a: 1 }]).to.not.have.members([{ a: 1 }]);
  });

  describe('docs example 164', () => {
    expect([1, 2, 3]).to.have.ordered.members([1, 2, 3]);
    expect([1, 2, 3]).to.have.members([2, 1, 3]).but.not.ordered.members([2, 1, 3]);
  });

  describe('docs example 165', () => {
    // Target array is a superset of [1, 2] but not identical
    expect([1, 2, 3]).to.include.members([1, 2]);
    expect([1, 2, 3]).to.not.have.members([1, 2]);

    // Duplicates in the subset are ignored
    expect([1, 2, 3]).to.include.members([1, 2, 2, 2]);
  });

  describe('docs example 166', () => {
    expect([{ a: 1 }, { b: 2 }, { c: 3 }])
      .to.include.deep.ordered.members([{ a: 1 }, { b: 2 }])
      .but.not.include.deep.ordered.members([{ b: 2 }, { c: 3 }]);
  });

  describe('docs example 167', () => {
    expect([1, 2]).to.not.include(3).and.not.include(4); // Recommended
    expect([1, 2]).to.not.have.members([3, 4]); // Not recommended
  });

  describe('docs example 168', () => {
    expect([1, 2]).to.have.members([1, 2, 3], 'nooo why fail??');
    expect([1, 2], 'nooo why fail??').to.have.members([1, 2, 3]);
  });

  describe('docs example 169', () => {
    expect(1).to.equal(1); // Recommended
    expect(1).to.be.oneOf([1, 2, 3]); // Not recommended
  });

  describe('docs example 170', () => {
    expect(1).to.equal(1); // Recommended
    expect(1).to.not.be.oneOf([2, 3, 4]); // Not recommended
  });

  describe('docs example 171', () => {
    expect('Today is sunny').to.contain.oneOf(['sunny', 'cloudy']);
    expect('Today is rainy').to.not.contain.oneOf(['sunny', 'cloudy']);
    expect([1, 2, 3]).to.contain.oneOf([3, 4, 5]);
    expect([1, 2, 3]).to.not.contain.oneOf([4, 5, 6]);
  });

  describe('docs example 172', () => {
    expect(1).to.be.oneOf([2, 3, 4], 'nooo why fail??');
    expect(1, 'nooo why fail??').to.be.oneOf([2, 3, 4]);
  });

  describe('docs example 173', () => {
    var dots = '',
      addDot = function () {
        dots += '.';
      },
      getDots = function () {
        return dots;
      };

    // Recommended
    expect(getDots()).to.equal('');
    addDot();
    expect(getDots()).to.equal('.');

    // Not recommended
    expect(addDot).to.change(getDots);
  });

  describe('docs example 174', () => {
    var myObj = { dots: '' },
      addDot = function () {
        myObj.dots += '.';
      };

    // Recommended
    expect(myObj).to.have.property('dots', '');
    addDot();
    expect(myObj).to.have.property('dots', '.');

    // Not recommended
    expect(addDot).to.change(myObj, 'dots');
  });

  describe('docs example 175', () => {
    var dots = '',
      noop = function () {},
      getDots = function () {
        return dots;
      };

    expect(noop).to.not.change(getDots);

    var myObj = { dots: '' },
      noop = function () {};

    expect(noop).to.not.change(myObj, 'dots');
  });

  describe('docs example 176', () => {
    var myObj = { dots: '' },
      addDot = function () {
        myObj.dots += '.';
      };

    expect(addDot).to.not.change(myObj, 'dots', 'nooo why fail??');

    var dots = '',
      addDot = function () {
        dots += '.';
      },
      getDots = function () {
        return dots;
      };

    expect(addDot, 'nooo why fail??').to.not.change(getDots);
  });

  describe('docs example 177', () => {
    var myObj = { val: 1 },
      addTwo = function () {
        myObj.val += 2;
      },
      subtractTwo = function () {
        myObj.val -= 2;
      };

    expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
    expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended

    expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
    expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended
  });

  describe('docs example 178', () => {
    var val = 1,
      addTwo = function () {
        val += 2;
      },
      getVal = function () {
        return val;
      };

    expect(addTwo).to.increase(getVal).by(2); // Recommended
    expect(addTwo).to.increase(getVal); // Not recommended
  });

  describe('docs example 179', () => {
    var myObj = { val: 1 },
      addTwo = function () {
        myObj.val += 2;
      };

    expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
    expect(addTwo).to.increase(myObj, 'val'); // Not recommended
  });

  describe('docs example 180', () => {
    var myObj = { val: 1 },
      subtractTwo = function () {
        myObj.val -= 2;
      };

    expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
    expect(subtractTwo).to.not.increase(myObj, 'val'); // Not recommended
  });

  describe('docs example 181', () => {
    var myObj = { val: 1 },
      noop = function () {};

    expect(noop).to.not.change(myObj, 'val'); // Recommended
    expect(noop).to.not.increase(myObj, 'val'); // Not recommended
  });

  describe('docs example 182', () => {
    var myObj = { val: 1 },
      noop = function () {};

    expect(noop).to.increase(myObj, 'val', 'nooo why fail??');

    var val = 1,
      noop = function () {},
      getVal = function () {
        return val;
      };

    expect(noop, 'nooo why fail??').to.increase(getVal);
  });

  describe('docs example 183', () => {
    var val = 1,
      subtractTwo = function () {
        val -= 2;
      },
      getVal = function () {
        return val;
      };

    expect(subtractTwo).to.decrease(getVal).by(2); // Recommended
    expect(subtractTwo).to.decrease(getVal); // Not recommended
  });

  describe('docs example 184', () => {
    var myObj = { val: 1 },
      subtractTwo = function () {
        myObj.val -= 2;
      };

    expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
    expect(subtractTwo).to.decrease(myObj, 'val'); // Not recommended
  });

  describe('docs example 185', () => {
    var myObj = { val: 1 },
      addTwo = function () {
        myObj.val += 2;
      };

    expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
    expect(addTwo).to.not.decrease(myObj, 'val'); // Not recommended
  });

  describe('docs example 186', () => {
    var myObj = { val: 1 },
      noop = function () {};

    expect(noop).to.not.change(myObj, 'val'); // Recommended
    expect(noop).to.not.decrease(myObj, 'val'); // Not recommended
  });

  describe('docs example 187', () => {
    var myObj = { val: 1 },
      noop = function () {};

    expect(noop).to.decrease(myObj, 'val', 'nooo why fail??');

    var val = 1,
      noop = function () {},
      getVal = function () {
        return val;
      };

    expect(noop, 'nooo why fail??').to.decrease(getVal);
  });

  describe('docs example 188', () => {
    var myObj = { val: 1 },
      addTwo = function () {
        myObj.val += 2;
      };

    expect(addTwo).to.increase(myObj, 'val').by(2);
  });

  describe('docs example 189', () => {
    var myObj = { val: 1 },
      subtractTwo = function () {
        myObj.val -= 2;
      };

    expect(subtractTwo).to.decrease(myObj, 'val').by(2);
  });

  describe('docs example 190', () => {
    var myObj = { val: 1 },
      addTwo = function () {
        myObj.val += 2;
      },
      subtractTwo = function () {
        myObj.val -= 2;
      };

    expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
    expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended

    expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
    expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended
  });

  describe('docs example 191', () => {
    var myObj = { val: 1 },
      addTwo = function () {
        myObj.val += 2;
      };

    // Recommended
    expect(addTwo).to.increase(myObj, 'val').by(2);

    // Not recommended
    expect(addTwo).to.increase(myObj, 'val').but.not.by(3);
  });

  describe('docs example 192', () => {
    var myObj = { val: 1 },
      addTwo = function () {
        myObj.val += 2;
      };

    expect(addTwo).to.increase(myObj, 'val').by(3, 'nooo why fail??');
    expect(addTwo, 'nooo why fail??').to.increase(myObj, 'val').by(3);
  });

  describe('docs example 193', () => {
    expect({ a: 1 }).to.be.extensible;
  });

  describe('docs example 194', () => {
    var nonExtensibleObject = Object.preventExtensions({}),
      sealedObject = Object.seal({}),
      frozenObject = Object.freeze({});

    expect(nonExtensibleObject).to.not.be.extensible;
    expect(sealedObject).to.not.be.extensible;
    expect(frozenObject).to.not.be.extensible;
    expect(1).to.not.be.extensible;
  });

  describe('docs example 195', () => {
    expect(1, 'nooo why fail??').to.be.extensible;
  });

  describe('docs example 196', () => {
    var sealedObject = Object.seal({});
    var frozenObject = Object.freeze({});

    expect(sealedObject).to.be.sealed;
    expect(frozenObject).to.be.sealed;
    expect(1).to.be.sealed;
  });

  describe('docs example 197', () => {
    expect({ a: 1 }).to.not.be.sealed;
  });

  describe('docs example 198', () => {
    expect({ a: 1 }, 'nooo why fail??').to.be.sealed;
  });

  describe('docs example 199', () => {
    var frozenObject = Object.freeze({});

    expect(frozenObject).to.be.frozen;
    expect(1).to.be.frozen;
  });

  describe('docs example 200', () => {
    expect({ a: 1 }).to.not.be.frozen;
  });

  describe('docs example 201', () => {
    expect({ a: 1 }, 'nooo why fail??').to.be.frozen;
  });

  describe('docs example 202', () => {
    expect(1).to.be.finite;
  });

  describe('docs example 203', () => {
    expect('foo').to.be.a('string'); // Recommended
    expect('foo').to.not.be.finite; // Not recommended
  });

  describe('docs example 204', () => {
    expect(NaN).to.be.NaN; // Recommended
    expect(NaN).to.not.be.finite; // Not recommended
  });

  describe('docs example 205', () => {
    expect(Infinity).to.equal(Infinity); // Recommended
    expect(Infinity).to.not.be.finite; // Not recommended
  });

  describe('docs example 206', () => {
    expect(-Infinity).to.equal(-Infinity); // Recommended
    expect(-Infinity).to.not.be.finite; // Not recommended
  });

  describe('docs example 207', () => {
    expect('foo', 'nooo why fail??').to.be.finite;
  });

  describe('docs example 208', () => {
    expect.fail();
    expect.fail('custom error message');
    expect.fail(1, 2);
    expect.fail(1, 2, 'custom error message');
    expect.fail(1, 2, 'custom error message', '>');
    expect.fail(1, 2, undefined, '>');
  });

  // describe('docs example 209', () => {
  //   should.fail();
  //   should.fail("custom error message");
  //   should.fail(1, 2);
  //   should.fail(1, 2, "custom error message");
  //   should.fail(1, 2, "custom error message", ">");
  //   should.fail(1, 2, undefined, ">");

  // });
}