29.7.0 • Published 2 months ago

jest-each v29.7.0

Weekly downloads
10,896,866
License
MIT
Repository
github
Last release
2 months ago

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

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

jest-jasmine2jest-circusarchetype-libraryeasy-select-rnreact-native-bluetooth2killi8n-react-native-fast-imagespecify-importsbabel-specify-imports@icanpm/api-masterreact-native-template-rfbaseairscanairscan-examplereact-native-esc-pos-sahaab@borisovart/atol-kkt-modulewcxcdeneme323112@ntt_app/react-native-custom-notificationreact-native-covid-sdkgql_din_modbitgetmyfrontdesk-test@olivervorasai/sliderreact-native-printer-brothersreact-native-shekhar-bridge-testwilscanner@oiti/documentoscopy-react-native@mink-opn/build-tokensquoc-testreact-native-slider-kfplginexpand-react-bridgeluminos-ui-coresklif-ui-kitsklif-api@everything-registry/sub-chunk-1955jawwy-sdkjawwy_gamification_release@314oner_npm/universal-components-libraryreact-native-sphereuisphereuijawwy_libraryreact-native-credit-card-pkgp149-tablesklif-uireact-native-jawwy_sample@furgot100/dates-lib@furgot100/string-libvue-permission-inertiajswebchezeo-collect@gaofq/utils@garonx/oracle-zkapp@geeky-apo/react-native-advanced-clipboardwifi_configuration_packagewarmaitech-gpt-3-encoderu-libraryxcim-codesandboxtrinny-londonvue-axios-restvirtual-tour-guide@hemith/react-native-tnk@hoangnguyennn/mysql-builderfluent.adflow.reactnativesdk-alphafluent.adflow.reactnativesdk@maricode1111/date-libfmsl@luciadias/storybook-notimation@massivepixel/use-query@simstudio/htmldiffjawwy_library_newjawy_library_v1gamification-jawwy-libraryframework_test_library_sixdee_new_jawwytest_lib_module_aarzzzxxxyyy321123tldrawlignintoo-long-bruvtest-haptik-libtest-library-123tailwind-vector-effectteapackage-tatespoorman297syncbackbasesstring-lib-alexharlanstringlbstyle-guide-maintestapatest-zeo-collecttestnpm_lmntext-based-game-enginesuperset-plugin-chart-hello-world2sushi-sdk-ftmsupercluster-googlemaps-adapter-clonessunki-lab7svelte-component-libstp-cdktypeorm-polymorphic-clonetypescript-requesttwine-libtwine-libraryunblock-me-solver
30.0.0-alpha.3

2 months ago

30.0.0-alpha.2

5 months ago

30.0.0-alpha.1

6 months ago

29.7.0

8 months ago

29.6.3

8 months ago

29.6.0

10 months ago

29.6.1

10 months ago

29.6.2

9 months ago

29.4.1

1 year ago

29.4.2

1 year ago

29.4.3

1 year ago

29.4.0

1 year ago

29.5.0

1 year ago

29.2.0

2 years ago

29.2.1

2 years ago

29.3.1

1 year ago

29.0.1

2 years ago

29.0.2

2 years ago

29.0.3

2 years ago

29.0.0

2 years ago

29.1.0

2 years ago

29.1.2

2 years ago

28.1.3

2 years ago

28.1.1

2 years ago

29.0.0-alpha.6

2 years ago

29.0.0-alpha.4

2 years ago

29.0.0-alpha.3

2 years ago

29.0.0-alpha.0

2 years ago

29.0.0-alpha.1

2 years ago

28.1.0

2 years ago

28.0.0-alpha.9

2 years ago

28.0.0

2 years ago

28.0.1

2 years ago

28.0.2

2 years ago

28.0.0-alpha.8

2 years ago

28.0.0-alpha.7

2 years ago

28.0.0-alpha.6

2 years ago

28.0.0-alpha.5

2 years ago

27.5.0

2 years ago

27.5.1

2 years ago

27.4.6

2 years ago

27.4.0

2 years ago

27.4.1

2 years ago

27.4.2

2 years ago

28.0.0-alpha.4

2 years ago

28.0.0-alpha.3

2 years ago

28.0.0-alpha.0

2 years ago

28.0.0-alpha.2

2 years ago

28.0.0-alpha.1

2 years ago

27.3.0

3 years ago

27.3.1

3 years ago

27.2.5

3 years ago

27.2.4

3 years ago

27.2.3

3 years ago

27.2.2

3 years ago

27.2.0

3 years ago

27.1.1

3 years ago

27.1.0

3 years ago

27.0.6

3 years ago

27.0.2

3 years ago

27.0.0

3 years ago

27.0.1

3 years ago

27.0.0-next.11

3 years ago

27.0.0-next.10

3 years ago

27.0.0-next.9

3 years ago

27.0.0-next.8

3 years ago

27.0.0-next.7

3 years ago

27.0.0-next.6

3 years ago

27.0.0-next.5

3 years ago

27.0.0-next.3

3 years ago

27.0.0-next.1

3 years ago

27.0.0-next.0

3 years ago

26.6.2

3 years ago

26.6.1

4 years ago

26.6.0

4 years ago

26.5.2

4 years ago

26.5.0

4 years ago

26.4.2

4 years ago

26.4.0

4 years ago

26.3.0

4 years ago

26.2.0

4 years ago

26.1.0

4 years ago

26.0.1

4 years ago

26.0.0

4 years ago

26.0.1-alpha.0

4 years ago

26.0.0-alpha.2

4 years ago

26.0.0-alpha.1

4 years ago

26.0.0-alpha.0

4 years ago

25.5.0

4 years ago

25.4.0

4 years ago

25.3.0

4 years ago

25.2.6

4 years ago

25.2.1-alpha.1

4 years ago

25.2.1-alpha.2

4 years ago

25.2.3

4 years ago

25.2.1

4 years ago

25.2.0

4 years ago

25.2.0-alpha.86

4 years ago

25.1.0

4 years ago

25.0.0

5 years ago

24.9.0

5 years ago

24.8.0

5 years ago

24.7.1

5 years ago

24.7.0

5 years ago

24.6.0

5 years ago

24.5.0

5 years ago

24.4.0

5 years ago

24.3.1

5 years ago

24.3.0

5 years ago

24.2.0-alpha.0

5 years ago

24.0.0

5 years ago

24.0.0-alpha.16

5 years ago

24.0.0-alpha.15

5 years ago

24.0.0-alpha.13

5 years ago

24.0.0-alpha.12

5 years ago

24.0.0-alpha.11

5 years ago

24.0.0-alpha.10

5 years ago

24.0.0-alpha.9

5 years ago

24.0.0-alpha.8

5 years ago

24.0.0-alpha.7

5 years ago

24.0.0-alpha.6

5 years ago

24.0.0-alpha.5

5 years ago

24.0.0-alpha.4

6 years ago

24.0.0-alpha.3

6 years ago

24.0.0-alpha.2

6 years ago

24.0.0-alpha.1

6 years ago

24.0.0-alpha.0

6 years ago

23.6.0

6 years ago

23.5.0

6 years ago

23.4.0

6 years ago

23.2.0

6 years ago

23.1.0

6 years ago

23.0.2

6 years ago

23.0.1

6 years ago

0.5.0

6 years ago

0.4.0

6 years ago

0.3.1

7 years ago

0.3.0

7 years ago

0.2.0

7 years ago

0.1.0

7 years ago

0.0.1

7 years ago