Home
Softono

Jest In Case

Open source MIT JavaScript
1.1K
Stars
19
Forks
13
Issues
10
Watchers
1 year
Last Commit

 About Jest In Case

Jest utility for creating variations of the same test

Platforms

Web Self-hosted

Languages

JavaScript

Need Help Installing Jest In Case?

We provide expert installation service for this software. Our team will install, configure, and secure Jest In Case on your server. plans start at just $30.

Jest In Case

View on GitHub

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

testCases 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 },
});

Inside 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': { ... },
});