jest-in-case
    DefinitelyTyped icon, indicating that this package has TypeScript declarations provided by the separate @types/jest-in-case package

    1.0.2 • Public • Published

    jest-in-case

    Jest utility for creating variations of the same test

    Example

    import { add, subtract } from './math';
    import cases from 'jest-in-case';
     
    cases('add(augend, addend)', opts => {
      expect(add(opts.augend, opts.addend)).toBe(opts.total);
    }, [
      { name: '1 + 1 = 2', augend: 1, addend: 1, total: 2 },
      { name: '2 + 1 = 3', augend: 2, addend: 1, total: 3 },
      { name: '3 + 1 = 4', augend: 3, addend: 1, total: 4 },
    ]);

    Installation

    yarn add --dev jest-in-case

    Usage

    In your Jest tests, import cases from jest-in-case.

    import cases from 'jest-in-case';
    // or
    const cases = require('jest-in-case');

    Then you can call cases with a title, a tester, and some testCases.

    cases(title, tester, testCases);

    cases can either be an array of objects with a name property:

    cases('add(augend, addend)', opts => {
      expect(add(opts.augend, opts.addend)).toBe(opts.total);
    }, [
      { name: '1 + 1 = 2', augend: 1, addend: 1, total: 2 },
      { name: '2 + 1 = 3', augend: 2, addend: 1, total: 3 },
      { name: '3 + 1 = 4', augend: 3, addend: 1, total: 4 },
    ]);

    Or an object of objects with the names as the keys:

    cases('subtract(minuend, subtrahend)', opts => {
      expect(subtract(opts.minuend, opts.subtrahend)).toBe(opts.difference);
    }, {
      '1 - 1 = 0': { minuend: 1, subtrahend: 1, difference: 0 },
      '2 - 1 = 1': { minuend: 2, subtrahend: 1, difference: 1 },
      '3 - 1 = 2': { minuend: 3, subtrahend: 1, difference: 2 },
    });

    Insider of a test case you can put whatever properties you want, except for name, only, or skip:

    cases('title', fn, [
      { name: 'reserved 1', only: true, skip: true, whatever: 'you', want: 'here' },
      { name: 'reserved 2', only: true, skip: true, whatever: 'you', want: 'here' },
      { name: 'reserved 3', only: true, skip: true, whatever: 'you', want: 'here' },
    ]);
    • name is passed to test(name, fn) to become the name of your test
    • When only is set to true it will use Jest's test.only function
    • When skip is set to true it will use Jest's test.skip function

    The tester function is called on each test case with your options:

    cases('title', opts => {
      console.log('passed: ', opts);
    }, {
      'test 1': { foo: 1 },
      'test 2': { bar: 2 },
      'test 3': { baz: 3 },
    });
     
    // passed: { foo: 1 }
    // passed: { bar: 2 }
    // passed: { baz: 3 }

    Your tester function works just like functions passed to Jest's test function do (Just with a prepended argument):

    cases('async functions', async opts => {
      let result = await somethingAsync(opts.input);
      expect(result).toEqual(opts.result);
    }, {
      'test 1': { ... },
      'test 2': { ... },
    });
     
    cases('done callback', (opts, done) => {
      somethingAsync(opts.input, result => {
        expect(result).toEqual(result);
        done();
      });
    }, {
      'test 1': { ... },
      'test 2': { ... },
    });

    Install

    npm i jest-in-case

    DownloadsWeekly Downloads

    18,333

    Version

    1.0.2

    License

    MIT

    Last publish

    Collaborators

    • thejameskyle