
Security News
ECMAScript 2025 Finalized with Iterator Helpers, Set Methods, RegExp.escape, and More
ECMAScript 2025 introduces Iterator Helpers, Set methods, JSON modules, and more in its latest spec update approved by Ecma in June 2025.
babel-jest-assertions
Advanced tools
Babel plugin that adds the number of assertions found in each test with expect.assertions(n)
🃏⁉️
Adds expect.assertions(n) and expect.hasAssertions to all tests automatically
Ever wondered if your tests are actually running their assertions, especially in asynchronous tests? Jest has two features
built in to help with this: expect.assertions(number)
and expect.hasAssertions()
. These can be
useful when doing something like:
it('resolves to one', () => {
Promise.reject(1).then(value => expect(value).toBe(1));
});
The issue here is the catch
case is not dealt with in this test, which is fine as we are testing the happy path,
but this test will currently pass even though the Promise
rejects and the assertion is never ran.
One solution is to manually adjust the above test to include expect.assertions(number)
and expect.hasAssertions()
this is quite verbose and prone to human error.
An alternative is a babel plugin to automate adding these additional properties, and this is such plugin 😉
With npm:
npm install --save-dev babel-jest-assertions
With yarn:
yarn add -D babel-jest-assertions
{
"plugins": ["babel-jest-assertions"]
}
babel --plugins babel-jest-assertions script.js
require('babel-core').transform('code', {
plugins: ['babel-jest-assertions'],
})
Simply write your tests as you would normally and this plugin will add the verification of assertions in the background.
One assertion
it('resolves to one', () => {
Promise.reject(1).then(value => expect(value).toBe(1));
});
↓ ↓ ↓ ↓ ↓ ↓
it('resolves to one', () => {
expect.hasAssertions();
expect.assertions(1);
Promise.reject(1).then(value => expect(value).toBe(1));
});
Note: this test will now fail 🎉
Multiple assertions
it('counts multiple assertions too', () => {
expect(1 + 0).toBe(1);
expect(0 + 1).toBe(1);
});
↓ ↓ ↓ ↓ ↓ ↓
it('counts multiple assertions too', () => {
expect.hasAssertions();
expect.assertions(2);
expect(1 + 0).toBe(1);
expect(0 + 1).toBe(1);
});
Asynchronous assertions
it('counts multiple assertions too', async () => {
const res = await fetch('www.example.com');
expect(res.json).toBeTruthy();
const json = await res.json();
expect(json).toEqual({ whatever: 'trevor' });
});
↓ ↓ ↓ ↓ ↓ ↓
it('counts multiple assertions too', async () => {
expect.hasAssertions();
expect.assertions(2);
const res = await fetch('www.example.com');
expect(res.json).toBeTruthy();
const json = await res.json();
expect(json).toEqual({ whatever: 'trevor' });
});
beforeEach and afterEach blocks
If you have expectations inside either of beforeEach
or afterEach
blocks for your test then these expects will be
included in the count - even if you have nested describe blocks each with their own beforeEach
/afterEach
the count
will accumulate.
beforeEach(() => {
expect(true).toBe(true);
});
afterEach(() => {
expect(true).toBe(true);
});
describe('.add', () => {
beforeEach(() => {
expect(true).toBe(true);
});
afterEach(() => {
expect(true).toBe(true);
});
it('returns 1 when given 0 and 1', () => {
expect(add(1, 0)).toEqual(1);
});
describe('.add2', () => {
beforeEach(() => {
expect(true).toBe(true);
});
afterEach(() => {
expect(true).toBe(true);
});
it('returns 1 when given 0 and 1', () => {
expect(add2(1, 0)).toEqual(1);
});
});
});
↓ ↓ ↓ ↓ ↓ ↓
beforeEach(() => {
expect(true).toBe(true);
});
afterEach(() => {
expect(true).toBe(true);
});
describe('.add', () => {
beforeEach(() => {
expect(true).toBe(true);
});
afterEach(() => {
expect(true).toBe(true);
});
it('returns 1 when given 0 and 1', () => {
expect.assertions(5);
expect.hasAssertions();
expect(add2(1, 0)).toEqual(1);
});
describe('.add2', () => {
beforeEach(() => {
expect(true).toBe(true);
});
afterEach(() => {
expect(true).toBe(true);
});
it('returns 1 when given 0 and 1', () => {
expect.assertions(7);
expect.hasAssertions();
expect(add2(1, 0)).toEqual(1);
});
});
});
Comments are ignored
it('ignores commented-out assertions', async () => {
const res = await fetch('www.example.com');
// expect(res.json).toBeTruthy();
const json = await res.json();
/*
expect(json).toEqual({ whatever: 'trevor1' });
*/
expect(json).toEqual({ whatever: 'trevor' });
/* expect(json).toEqual({ whatever: 'trevor2' }); */
});
↓ ↓ ↓ ↓ ↓ ↓
it('counts multiple assertions too', async () => {
expect.hasAssertions();
expect.assertions(1);
const res = await fetch('www.example.com');
// expect(res.json).toBeTruthy();
const json = await res.json();
/*
expect(json).toEqual({ whatever: 'trevor1' });
*/
expect(json).toEqual({ whatever: 'trevor' });
/* expect(json).toEqual({ whatever: 'trevor2' }); */
});
If you add either expect.assertions(number)
or expect.hasAssertions()
then your defaults will be favoured and the
plugin will skip the test.
it('will leave test as override supplied', () => {
expect.hasAssertions();
expect.assertions(1);
if (true) {
expect(true).toBe(true);
}
if (false) {
expect(false).toBe(false);
}
});
↓ ↓ ↓ ↓ ↓ ↓
it('will leave test as override supplied', () => {
expect.hasAssertions();
expect.assertions(1);
if (true) {
expect(true).toBe(true);
}
if (false) {
expect(false).toBe(false);
}
});
Matt Phillips 💻 📖 🚇 ⚠️ | Ramesh Nair 💻 📖 💡 ⚠️ | Huy Nguyen 🐛 | Simon Boudrias 🐛 | Giuseppe 🤔 |
---|
MIT
FAQs
Babel plugin that adds the number of assertions found in each test with expect.assertions(n)
The npm package babel-jest-assertions receives a total of 12,608 weekly downloads. As such, babel-jest-assertions popularity was classified as popular.
We found that babel-jest-assertions demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
ECMAScript 2025 introduces Iterator Helpers, Set methods, JSON modules, and more in its latest spec update approved by Ecma in June 2025.
Security News
A new Node.js homepage button linking to paid support for EOL versions has sparked a heated discussion among contributors and the wider community.
Research
North Korean threat actors linked to the Contagious Interview campaign return with 35 new malicious npm packages using a stealthy multi-stage malware loader.