Socket
Socket
Sign inDemoInstall

jest-each

Package Overview
Dependencies
109
Maintainers
4
Versions
143
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    jest-each

Parameterised tests for Jest


Version published
Weekly downloads
20M
decreased by-9.14%
Maintainers
4
Install size
4.21 MB
Created
Weekly downloads
 

Changelog

Source

24.9.0

Features

  • [expect] Highlight substring differences when matcher fails, part 1 (#8448)
  • [expect] Highlight substring differences when matcher fails, part 2 (#8528)
  • [expect] Improve report when mock-spy matcher fails, part 1 (#8640)
  • [expect] Improve report when mock-spy matcher fails, part 2 (#8649)
  • [expect] Improve report when mock-spy matcher fails, part 3 (#8697)
  • [expect] Improve report when mock-spy matcher fails, part 4 (#8710)
  • [expect] Throw matcher error when received cannot be jasmine spy (#8747)
  • [expect] Improve report when negative CalledWith assertion fails (#8755)
  • [expect] Improve report when positive CalledWith assertion fails (#8771)
  • [expect] Display equal values for ReturnedWith similar to CalledWith (#8791)
  • [expect, jest-snapshot] Change color from green for some args in matcher hints (#8812)
  • [jest-snapshot] Highlight substring differences when matcher fails, part 3 (#8569)
  • [jest-core] Improve report when snapshots are obsolete (#8665)
  • [jest-cli] Improve chai support (with detailed output, to match jest exceptions) (#8454)
  • [*] Manage the global timeout with --testTimeout command line argument. (#8456)
  • [pretty-format] Render custom displayName of memoized components (#8546)
  • [jest-validate] Allow maxWorkers as part of the jest.config.js (#8565)
  • [jest-runtime] Allow passing configuration objects to transformers (#7288)
  • [@jest/core, @jest/test-sequencer] Support async sort in custom testSequencer (#8642)
  • [jest-runtime, @jest/fake-timers] Add jest.advanceTimersToNextTimer (#8713)
  • [@jest-transform] Extract transforming require logic within jest-core into @jest-transform (#8756)
  • [jest-matcher-utils] Add color options to matcherHint (#8795)
  • [jest-circus/jest-jasmine2] Give clearer output for Node assert errors (#8792)
  • [jest-runner] Export all types in the type signature of jest-runner (#8825)

Fixes

  • [jest-cli] Detect side-effect only imports when running --onlyChanged or --changedSince (#8670)
  • [jest-cli] Allow --maxWorkers to work with % input again (#8565)
  • [babel-plugin-jest-hoist] Expand list of whitelisted globals in global mocks (#8429)
  • [jest-core] Make watch plugin initialization errors look nice (#8422)
  • [jest-snapshot] Prevent inline snapshots from drifting when inline snapshots are updated (#8492)
  • [jest-haste-map] Don't throw on missing mapper in Node crawler (#8558)
  • [jest-core] Fix incorrect passWithNoTests warning (#8595)
  • [jest-snapshots] Fix test retries that contain snapshots (#8629)
  • [jest-mock] Fix incorrect assignments when restoring mocks in instances where they originally didn't exist (#8631)
  • [expect] Fix stack overflow when matching objects with circular references (#8687)
  • [jest-haste-map] Workaround a node >=12.5.0 bug that causes the process not to exit after tests have completed and cancerous memory growth (#8787)

Chore & Maintenance

  • [docs] Replace FlowType with TypeScript in CONTRIBUTING.MD code conventions
  • [jest-leak-detector] remove code repeat (#8438)
  • [docs] Add example to jest.requireActual (#8482)
  • [docs] Add example to jest.mock for mocking ES6 modules with the factory parameter (#8550)
  • [docs] Add information about using jest.doMock with ES6 imports (#8573)
  • [docs] Fix variable name in custom-matcher-api code example (#8582)
  • [docs] Fix example used in custom environment docs (#8617)
  • [docs] Updated react tutorial to refer to new package of react-testing-library (@testing-library/react) (#8753)
  • [docs] Updated imports of react-testing-library to @testing-library/react in website (#8757)
  • [jest-core] Add getVersion (moved from jest-cli) (#8706)
  • [docs] Fix MockFunctions example that was using toContain instead of toContainEqual (#8765)
  • [*] Make sure copyright header comment includes license (#8783)
  • [*] Check copyright and license as one joined substring (#8815)
  • [docs] Fix WatchPlugins jestHooks.shouldRunTestSuite example that receives an object (#8784)
  • [*] Enforce LF line endings (#8809)
  • [pretty-format] Delete obsolete link and simplify structure in README (#8824)
  • [docs] Fix broken transform link on webpack page (#9155)

Performance

  • [jest-watcher] Minor optimization for JestHook (#8746)
  • [@jest/reporters] Prevent runaway CPU usage with --notify on macOS (#8831)

Readme

Source

jest-each

Jest Parameterised Testing

version downloads MIT License

A parameterised testing library for Jest inspired by mocha-each.

jest-each allows you to provide multiple arguments to your test/describe which results in the test/suite being run once per row of parameters.

Features

  • .test to runs multiple tests with parameterised data
    • Also under the alias: .it
  • .test.only to only run the parameterised tests
    • Also under the aliases: .it.only or .fit
  • .test.skip to skip the parameterised tests
    • Also under the aliases: .it.skip or .xit or .xtest
  • .describe to runs test suites with parameterised data
  • .describe.only to only run the parameterised suite of tests
    • Also under the aliases: .fdescribe
  • .describe.skip to skip the parameterised suite of tests
    • Also under the aliases: .xdescribe
  • Asynchronous tests with done
  • Unique test titles with printf formatting:
    • %p - pretty-format.
    • %s- String.
    • %d- Number.
    • %i - Integer.
    • %f - Floating point value.
    • %j - JSON.
    • %o - Object.
    • %# - Index of the test case.
    • %% - single percent sign ('%'). This does not consume an argument.
  • 🖖 Spock like data tables with Tagged Template Literals

Demo

Tests without jest-each

Current jest tests

Tests can be re-written with jest-each to:

.test

Current jest tests

.test with Tagged Template Literals

Current jest tests

.describe

Current jest tests

Installation

npm i --save-dev jest-each

yarn add -D jest-each

Importing

jest-each is a default export so it can be imported with whatever name you like.

// es6
import each from 'jest-each';
// es5
const each = require('jest-each').default;

Array of rows

API

each([parameters]).test(name, testFn)
each:
  • parameters: Array of Arrays with the arguments that are passed into the testFn for each row
    • Note If you pass in a 1D array of primitives, internally it will be mapped to a table i.e. [1, 2, 3] -> [[1], [2], [3]]
.test:
  • name: String the title of the test.
    • Generate unique test titles by positionally injecting parameters with printf formatting:
      • %p - pretty-format.
      • %s- String.
      • %d- Number.
      • %i - Integer.
      • %f - Floating point value.
      • %j - JSON.
      • %o - Object.
      • %# - Index of the test case.
      • %% - single percent sign ('%'). This does not consume an argument.
  • testFn: Function the test logic, this is the function that will receive the parameters of each row as function arguments
each([parameters]).describe(name, suiteFn)
each:
  • parameters: Array of Arrays with the arguments that are passed into the suiteFn for each row
    • Note If you pass in a 1D array of primitives, internally it will be mapped to a table i.e. [1, 2, 3] -> [[1], [2], [3]]
.describe:
  • name: String the title of the describe
    • Generate unique test titles by positionally injecting parameters with printf formatting:
      • %p - pretty-format.
      • %s- String.
      • %d- Number.
      • %i - Integer.
      • %f - Floating point value.
      • %j - JSON.
      • %o - Object.
      • %# - Index of the test case.
      • %% - single percent sign ('%'). This does not consume an argument.
  • suiteFn: Function the suite of test/its to be ran, this is the function that will receive the parameters in each row as function arguments

Usage

.test(name, fn)

Alias: .it(name, fn)

each([[1, 1, 2], [1, 2, 3], [2, 1, 3]]).test(
  'returns the result of adding %d to %d',
  (a, b, expected) => {
    expect(a + b).toBe(expected);
  },
);
.test.only(name, fn)

Aliases: .it.only(name, fn) or .fit(name, fn)

each([[1, 1, 2], [1, 2, 3], [2, 1, 3]]).test.only(
  'returns the result of adding %d to %d',
  (a, b, expected) => {
    expect(a + b).toBe(expected);
  },
);
.test.skip(name, fn)

Aliases: .it.skip(name, fn) or .xit(name, fn) or .xtest(name, fn)

each([[1, 1, 2], [1, 2, 3], [2, 1, 3]]).test.skip(
  'returns the result of adding %d to %d',
  (a, b, expected) => {
    expect(a + b).toBe(expected);
  },
);
Asynchronous .test(name, fn(done))

Alias: .it(name, fn(done))

each([['hello'], ['mr'], ['spy']]).test(
  'gives 007 secret message: %s',
  (str, done) => {
    const asynchronousSpy = message => {
      expect(message).toBe(str);
      done();
    };
    callSomeAsynchronousFunction(asynchronousSpy)(str);
  },
);
.describe(name, fn)
each([[1, 1, 2], [1, 2, 3], [2, 1, 3]]).describe(
  '.add(%d, %d)',
  (a, b, expected) => {
    test(`returns ${expected}`, () => {
      expect(a + b).toBe(expected);
    });

    test('does not mutate first arg', () => {
      a + b;
      expect(a).toBe(a);
    });

    test('does not mutate second arg', () => {
      a + b;
      expect(b).toBe(b);
    });
  },
);
.describe.only(name, fn)

Aliases: .fdescribe(name, fn)

each([[1, 1, 2], [1, 2, 3], [2, 1, 3]]).describe.only(
  '.add(%d, %d)',
  (a, b, expected) => {
    test(`returns ${expected}`, () => {
      expect(a + b).toBe(expected);
    });
  },
);
.describe.skip(name, fn)

Aliases: .xdescribe(name, fn)

each([[1, 1, 2], [1, 2, 3], [2, 1, 3]]).describe.skip(
  '.add(%d, %d)',
  (a, b, expected) => {
    test(`returns ${expected}`, () => {
      expect(a + b).toBe(expected);
    });
  },
);

Tagged Template Literal of rows

API

each[tagged template].test(name, suiteFn)
each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`.test('returns $expected when adding $a to $b', ({a, b, expected}) => {
  expect(a + b).toBe(expected);
});
each takes a tagged template string with:
  • First row of variable name column headings seperated with |
  • One or more subsequent rows of data supplied as template literal expressions using ${value} syntax.
.test:
  • name: String the title of the test, use $variable in the name string to inject test values into the test title from the tagged template expressions
    • To inject nested object values use you can supply a keyPath i.e. $variable.path.to.value
  • testFn: Function the test logic, this is the function that will receive the parameters of each row as function arguments
each[tagged template].describe(name, suiteFn)
each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`.describe('$a + $b', ({a, b, expected}) => {
  test(`returns ${expected}`, () => {
    expect(a + b).toBe(expected);
  });

  test('does not mutate first arg', () => {
    a + b;
    expect(a).toBe(a);
  });

  test('does not mutate second arg', () => {
    a + b;
    expect(b).toBe(b);
  });
});
each takes a tagged template string with:
  • First row of variable name column headings seperated with |
  • One or more subsequent rows of data supplied as template literal expressions using ${value} syntax.
.describe:
  • name: String the title of the test, use $variable in the name string to inject test values into the test title from the tagged template expressions
    • To inject nested object values use you can supply a keyPath i.e. $variable.path.to.value
  • suiteFn: Function the suite of test/its to be ran, this is the function that will receive the parameters in each row as function arguments

Usage

.test(name, fn)

Alias: .it(name, fn)

each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`.test('returns $expected when adding $a to $b', ({a, b, expected}) => {
  expect(a + b).toBe(expected);
});
.test.only(name, fn)

Aliases: .it.only(name, fn) or .fit(name, fn)

each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`.test.only('returns $expected when adding $a to $b', ({a, b, expected}) => {
  expect(a + b).toBe(expected);
});
.test.skip(name, fn)

Aliases: .it.skip(name, fn) or .xit(name, fn) or .xtest(name, fn)

each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`.test.skip('returns $expected when adding $a to $b', ({a, b, expected}) => {
  expect(a + b).toBe(expected);
});
Asynchronous .test(name, fn(done))

Alias: .it(name, fn(done))

each`
  str
  ${'hello'}
  ${'mr'}
  ${'spy'}
`.test('gives 007 secret message: $str', ({str}, done) => {
  const asynchronousSpy = message => {
    expect(message).toBe(str);
    done();
  };
  callSomeAsynchronousFunction(asynchronousSpy)(str);
});
.describe(name, fn)
each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`.describe('$a + $b', ({a, b, expected}) => {
  test(`returns ${expected}`, () => {
    expect(a + b).toBe(expected);
  });

  test('does not mutate first arg', () => {
    a + b;
    expect(a).toBe(a);
  });

  test('does not mutate second arg', () => {
    a + b;
    expect(b).toBe(b);
  });
});
.describe.only(name, fn)

Aliases: .fdescribe(name, fn)

each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`.describe.only('$a + $b', ({a, b, expected}) => {
  test(`returns ${expected}`, () => {
    expect(a + b).toBe(expected);
  });
});
.describe.skip(name, fn)

Aliases: .xdescribe(name, fn)

each`
  a    | b    | expected
  ${1} | ${1} | ${2}
  ${1} | ${2} | ${3}
  ${2} | ${1} | ${3}
`.describe.skip('$a + $b', ({a, b, expected}) => {
  test(`returns ${expected}`, () => {
    expect(a + b).toBe(expected);
  });
});

License

MIT

Keywords

FAQs

Last updated on 16 Aug 2019

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.

Install

Related posts

SocketSocket SOC 2 Logo

Product

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

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc