jest-each
has a new home over in core Jest 🎉
From Jest >=23 jest-each
is available natively with test.each
and describe.each
see docs here
If you are using an older version of Jest I am still maintaining jest-each
over in the core repo so you can still use jest-each
in the exact same way as normal 😊
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.
.test
to runs multiple tests with parameterised data- Also under the alias:
.it
- Also under the alias:
.test.only
to only run the parameterised tests- Also under the aliases:
.it.only
or.fit
- Also under the aliases:
.test.skip
to skip the parameterised tests- Also under the aliases:
.it.skip
or.xit
or.xtest
- Also under the aliases:
.describe
to runs test suites with parameterised data.describe.only
to only run the parameterised suite of tests- Also under the aliases:
.fdescribe
- Also under the aliases:
.describe.skip
to skip the parameterised suite of tests- Also under the aliases:
.xdescribe
- Also under the aliases:
- Asynchronous tests with
done
- Unique test titles with: sprintf
- 🖖 Spock like data tables with Tagged Template Literals
.test
.test
with Tagged Template Literals
.describe
npm i --save-dev jest-each
yarn add -D jest-each
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');
- parameters:
Array
of Arrays with the arguments that are passed into thetestFn
for each row
- name:
String
the title of thetest
, use%s
in the name string to positionally inject parameter values into the test title - testFn:
Function
the test logic, this is the function that will receive the parameters of each row as function arguments
- parameters:
Array
of Arrays with the arguments that are passed into thesuiteFn
for each row
- name:
String
the title of thedescribe
, use%s
in the name string to positionally inject parameter values into the suite title - suiteFn:
Function
the suite oftest
/it
s to be ran, this is the function that will receive the parameters in each row as function arguments
Alias: .it(name, fn)
each([
[1, 1, 2],
[1, 2, 3],
[2, 1, 3],
]).test('returns the result of adding %s to %s', (a, b, expected) => {
expect(a + b).toBe(expected);
});
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 %s to %s', (a, b, expected) => {
expect(a + b).toBe(expected);
});
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 %s to %s', (a, b, expected) => {
expect(a + b).toBe(expected);
});
Alias: .it(name, fn(done))
each([
['hello'],
['mr'],
['spy'],
]).test('gives 007 secret message ', (str, done) => {
const asynchronousSpy = (message) => {
expect(message).toBe(str);
done();
};
callSomeAsynchronousFunction(asynchronousSpy)(str);
});
each([
[1, 1, 2],
[1, 2, 3],
[2, 1, 3],
]).describe('.add(%s, %s)', (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);
});
});
Aliases: .fdescribe(name, fn)
each([
[1, 1, 2],
[1, 2, 3],
[2, 1, 3],
]).describe.only('.add(%s, %s)', (a, b, expected) => {
test(`returns ${expected}`, () => {
expect(a + b).toBe(expected);
});
});
Aliases: .xdescribe(name, fn)
each([
[1, 1, 2],
[1, 2, 3],
[2, 1, 3],
]).describe.skip('.add(%s, %s)', (a, b, expected) => {
test(`returns ${expected}`, () => {
expect(a + b).toBe(expected);
});
});
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);
});
- First row of variable name column headings seperated with
|
- One or more subsequent rows of data supplied as template literal expressions using
${value}
syntax.
- name:
String
the title of thetest
, use$variable
in the name string to inject test values into the test title from the tagged template expressions - testFn:
Function
the test logic, this is the function that will receive the parameters of each row as function arguments
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);
});
});
- First row of variable name column headings seperated with
|
- One or more subsequent rows of data supplied as template literal expressions using
${value}
syntax.
- name:
String
the title of thetest
, use$variable
in the name string to inject test values into the test title from the tagged template expressions - suiteFn:
Function
the suite oftest
/it
s to be ran, this is the function that will receive the parameters in each row as function arguments
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);
});
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);
});
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);
});
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);
});
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);
});
});
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);
});
});
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);
});
});
MIT