New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

babel-jest-assertions

Package Overview
Dependencies
Maintainers
1
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

babel-jest-assertions

Babel plugin that adds the number of assertions found in each test with expect.assertions(n)

  • 0.1.0
  • latest
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
180
decreased by-7.22%
Maintainers
1
Weekly downloads
 
Created
Source

babel-jest-assertions

🃏⁉️

Adds expect.assertions(n) and expect.hasAssertions to all tests automatically


Build Status Code Coverage version downloads MIT License PRs Welcome Roadmap Examples

Problem

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.

Solution

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 😉

Installation

With npm:

npm install --save-dev babel-jest-assertions

With yarn:

yarn add -D babel-jest-assertions

Setup

.babelrc

{
  "plugins": ["babel-jest-assertions"]
}

CLI

babel --plugins babel-jest-assertions script.js

Node

require('babel-core').transform('code', {
  plugins: ['babel-jest-assertions'],
})

Usage

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' }); */
});

Override

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);
  }
});

Contributors


Matt Phillips

💻 📖 🚇 ⚠️

Ramesh Nair

💻 📖 💡 ⚠️

Huy Nguyen

🐛

Simon Boudrias

🐛

Giuseppe

🤔

LICENSE

MIT

Keywords

FAQs

Package last updated on 28 Dec 2017

Did you know?

Socket

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.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc