29.7.0 • Published 4 months ago

jest-each v29.7.0

Weekly downloads
10,896,866
License
MIT
Repository
github
Last release
4 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_releasereact-native-sphereuisphereuijawwy_libraryreact-native-credit-card-pkgp149-tablesklif-uireact-native-jawwy_samplegriffin-ui-librarynebula-http-resiliencycomposizetailwind-vector-effectsyncbackbasestest-library-123test-haptik-libwontbreakwebchewoven-challenge-deployxcim-codesandboxwifi_configuration_packagern-tm-notifyrn-use-modal-hookrn-currency-formatterrn-counter-demorn-session-multiplier-demorn_unique_device_idrnttlockreqioxresponsis-gantt-task-reactresponsive-react-appreactnativelyreactofy-css-libraryreikamoon-string-library-aarfp-librn-check-btnrn-adyen-dropinteapackage-tatespoorman297superset-plugin-chart-hello-world2supercluster-googlemaps-adapter-clonesstanikionespotify-ds-sestp-cdkrouter-loggerreact-native-wtfreact-native-version-appreact-native-withframework-checkselenium-side-runnerselenium-side-runner-with-hooksserde_json_maintestapatest-zeo-collecttestnpm_lmnsvelte-component-libtext-based-game-enginevision-camera-plugin-face-detectorvision-camera-plugin-scan-facesvision-camera-base64-resizedutrobin-jest-puppeteer-reactvantiq-reactvue-axios-rest@atlantjs.dev/guardian@simstudio/htmldiffjawwy_library_newjawy_library_v1
30.0.0-alpha.6

4 months ago

30.0.0-alpha.5

6 months ago

30.0.0-alpha.4

6 months ago

30.0.0-alpha.3

9 months ago

30.0.0-alpha.2

1 year ago

30.0.0-alpha.1

1 year ago

29.7.0

1 year ago

29.6.3

1 year ago

29.6.0

1 year ago

29.6.1

1 year ago

29.6.2

1 year ago

29.4.1

2 years ago

29.4.2

2 years ago

29.4.3

2 years ago

29.4.0

2 years ago

29.5.0

2 years ago

29.2.0

2 years ago

29.2.1

2 years ago

29.3.1

2 years 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

3 years ago

28.0.0-alpha.9

3 years ago

28.0.0

3 years ago

28.0.1

3 years ago

28.0.2

3 years ago

28.0.0-alpha.8

3 years ago

28.0.0-alpha.7

3 years ago

28.0.0-alpha.6

3 years ago

28.0.0-alpha.5

3 years ago

27.5.0

3 years ago

27.5.1

3 years ago

27.4.6

3 years ago

27.4.0

3 years ago

27.4.1

3 years ago

27.4.2

3 years ago

28.0.0-alpha.4

3 years ago

28.0.0-alpha.3

3 years ago

28.0.0-alpha.0

3 years ago

28.0.0-alpha.2

3 years ago

28.0.0-alpha.1

3 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

4 years ago

27.0.0-next.10

4 years ago

27.0.0-next.9

4 years ago

27.0.0-next.8

4 years ago

27.0.0-next.7

4 years ago

27.0.0-next.6

4 years ago

27.0.0-next.5

4 years ago

27.0.0-next.3

4 years ago

27.0.0-next.1

4 years ago

27.0.0-next.0

4 years ago

26.6.2

4 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

5 years ago

26.0.0

5 years ago

26.0.1-alpha.0

5 years ago

26.0.0-alpha.2

5 years ago

26.0.0-alpha.1

5 years ago

26.0.0-alpha.0

5 years ago

25.5.0

5 years ago

25.4.0

5 years ago

25.3.0

5 years ago

25.2.6

5 years ago

25.2.1-alpha.1

5 years ago

25.2.1-alpha.2

5 years ago

25.2.3

5 years ago

25.2.1

5 years ago

25.2.0

5 years ago

25.2.0-alpha.86

5 years ago

25.1.0

5 years ago

25.0.0

5 years ago

24.9.0

5 years ago

24.8.0

6 years ago

24.7.1

6 years ago

24.7.0

6 years ago

24.6.0

6 years ago

24.5.0

6 years ago

24.4.0

6 years ago

24.3.1

6 years ago

24.3.0

6 years ago

24.2.0-alpha.0

6 years ago

24.0.0

6 years ago

24.0.0-alpha.16

6 years ago

24.0.0-alpha.15

6 years ago

24.0.0-alpha.13

6 years ago

24.0.0-alpha.12

6 years ago

24.0.0-alpha.11

6 years ago

24.0.0-alpha.10

6 years ago

24.0.0-alpha.9

6 years ago

24.0.0-alpha.8

6 years ago

24.0.0-alpha.7

6 years ago

24.0.0-alpha.6

6 years ago

24.0.0-alpha.5

6 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

7 years ago

0.4.0

7 years ago

0.3.1

7 years ago

0.3.0

7 years ago

0.2.0

8 years ago

0.1.0

8 years ago

0.0.1

8 years ago