Assertion library with focus on TypeScript
Full TypeScript support
Fuzzy matching for eql with hein.any
npm/hein-plugin-sinon - Provides assertions like to.have.been.calledOnce() and to.have.been.calledWith() for sinon spies.
import { assert } from 'hein';
import { equal } from 'hein/assert';
equal(1, 1);
assert.equal(1, 1);
import { expect } from 'hein';
expect(1).to.equal(1);
There are multiple side-effect free tokens to chain assertions together. These include:
expect(5).to.be.a.number(); // same as expect(5).number();
Not inverts the conditions inside the expectation.
expect(5).to.not.equal(4);
Run the assertion for each member of an array
expect([1, 2, 3]).every.to.be.a.number();
Run the assertion on the length of an array
expect([1, 2, 3]).length.to.be.greaterThan(2);
Clears most of the state in the chain (with the exception of the effects of .every);
expect(1).to.not.be.greaterThan(5).and.be.greaterThan(0);
Alias for greaterThan
Assert that value is an array
expect([]).to.be.an.array();
Alias for greaterThanOrEqual
Alias for lessThanOrEqual
Assert that value is within a range of expectation (default is 0.1 - within 10%)
expect(1.1).to.be.in.ballpark(1);
expect(120).to.be.in.ballpark(100, 0.2);
Alias for lessThan
Assert that value is a BigInt
expect(BigInt(5)).to.be.a.bigint();
Assert that value is a boolean
expect(true).to.be.a.boolean();
Alias for include
Assert that value is an instance of Date
expect(new Date()).to.be.a.date();
Assert that array / object / Map / Set is empty
expect([]).to.be.empty();
expect({}).to.be.empty();
expect(new Map()).to.be.empty();
expect(new Set()).to.be.empty();
Assert that string ends with argument
expect('hein').to.endWith('in');
Assert that value deep equals the expectation. When combined with .partially expected may have missing properties
expect({ a: 1 }).to.eql({ a: 1 });
expect({ a: 1, b: new Date() }).to.partially.eql({ a: 1 });
import { any, createEvaluation } from 'hein';
expect({ a: 1, b: new Date(), c: Math.random() }).to.eql({
a: 1,
b: any,
c: createEvaluation((n) => typeof n === 'number')
});
Alias for equal
Assert that value strictly equals expectation. NaN is treated as a non-unique value. Chaining with .deep is an alias for [#eql]
expect('hein').to.equal('hein');
expect(NaN).to.equal(NaN);
expect({ a: 1 }).to.deep.equal({ a: 1 });
Assert that value is false
expect(false).to.be.false();
Assert that value is a function
expect(() => {}).to.be.a.function();
Assert that value is greater than expectation
expect(5).to.be.greaterThan(4);
Alias for greaterThan
Assert that value is greater than or equal to argument
expect(5).to.be.greaterThanOrEqual(5);
expect(5).to.be.greaterThanOrEqual(4);
Alias for greaterThanOrEqual
Assert that element / substring is present in array / string
expect([1, 2, 3]).to.include(2);
expect('hein').to.include('ei');
Assert that value is an instance of provided constructor
expect(new Error()).to.be.an.instanceOf(Error);
Assert that object has keys
expect({ a: 1, b: 2 }).to.have.keys(['a', 'b']);
expect({ a: 1, b: 2 }).to.have.keys('a');
Assert that value has a length equal to argument
expect([1]).to.have.a.lengthOf(1);
expect({ a: 1 }).to.have.a.lengthOf(1);
expect(new Map([['a', 1]])).to.have.a.lengthOf(1);
expect(new Set([1])).to.have.a.lengthOf(1);
expect('hein').to.have.a.lengthOf(4);
Assert that date is before argument
expect(new Date(2020, 1, 2)).to.be.after(new Date(2020, 1, 1));
Assert that date is before argument
expect(new Date(2020, 1, 1)).to.be.before(new Date(2020, 1, 2));
Assert that date or number is between arguments
expect(new Date(2020, 1, 2)).to.be.between(new Date(2020, 1, 1), new Date(2020, 1, 3));
expect(2).to.be.between(1, 3);
Assert that value is less than expectation
expect(5).to.be.lessThan(6);
Alias for lessThan
Assert that value is less than or equal to expectation
expect(5).to.be.lessThanOrEqual(5);
expect(4).to.be.lessThanOrEqual(5);
Alias for lessThanOrEqual
Assert that value is an instance of Map
expect(new Map()).to.be.a.Map();
Assert that array contains members of expectation
expect([1, 2, 3]).to.have.members([1, 2]);
// check that the arrays have same length
expect([1, 2, 3]).to.have.same.members([1, 2, 3]);
// check that the members are found in the same order
expect([1, 2, 3]).to.have.ordered.members([1, 2, 3]);
// check for deep equality of members
expect([{ a: 1 }, { b: 2 }]).to.have.deep.members([{ a: 1 }]);
// check for members by partial equality
expect([{ a: 1 }, { b: 2 }]).to.have.partially.members([{ a: 1 }]);
Assert that value is NaN
expect(NaN).to.be.NaN();
Assert that value is null
expect(null).to.be.null();
Assert that value is a number
expect(5).to.be.a.number();
Assert that value is an object. Null and instances of Array don't count
expect({}).to.be.an.object();
Assert that actual has property. Optionally check that propery has value
expect({ a: 1 }).to.have.property('a');
expect({ a: 1 }).to.have.property('a', 1);
Assert that provided Promise rejects. At the moment this is the only assertion that can't be chained, returns a promise
await expect(Promise.reject()).to.reject();
Assert that number can be rounded to target
expect(5.5).to.be.roundTo(6);
expect(5.14).to.roundTo(5.1, 1);
expect(110).to.roundTo(100, -2);
Assert that value is an instance of Set
expect(new Set()).to.be.a.Set();
Alias of lengthOf
Assert that string starts with argument
expect('hein').to.startWith('he');
Assert that value is a string
expect('hein').to.be.a.string();
Assert that value is a symbol
expect(Symbol()).to.be.a.symbol();
Assert that provided function throws
expect(() => {
throw new Error();
}).to.throw();
Assert that value is true
expect(true).to.be.true;
Assert that value is undefined
expect(undefined).to.be.undefined();
Assert that value is an instance of WeakMap
expect(new WeakMap()).to.be.a.WeakMap();
Assert that value is an instance of WeakSet
expect(new WeakSet()).to.be.a.WeakSet();
Exclude properties from assertion
expect({ a: 1, b: 2 }).excluding('a').to.eql({ b: 2 });