Jest Cheat Sheet

From WikiOD

Here is the cheatsheat of Jest and basic guide on how to use Jest

Testing[edit | edit source]

{: .-three-column}

Quick start[edit | edit source]

{: .-prime}

npm install --save-dev jest babel-jest

{: data-line=“1”}

/* Add to package.json */
"scripts": {
  "test": "jest"
}
# Run your tests
npm test -- --watch

See: Getting started

Writing tests[edit | edit source]

describe('My work', () => {
  test('works', () => {
    expect(2).toEqual(2)
  })
})

See: describe(), test(), expect()

BDD syntax[edit | edit source]

describe('My work', () => {
  it('works', () => {
    ···
  })
})

it is an alias for test. See: test()

Setup[edit | edit source]

beforeEach(() => { ... })
afterEach(() => { ... })
beforeAll(() => { ... })
afterAll(() => { ... })

See: afterAll() and more

Focusing tests[edit | edit source]

describe.only(···)
it.only(···) // alias: fit()

See: test.only

Skipping tests[edit | edit source]

describe.skip(···)
it.skip(···) // alias: xit()

See: test.skip

Optional flags[edit | edit source]

Flag Description
--coverage See a summary of test coverage
--detectOpenHandles See a summary of ports that didn’t close
--runInBand Run all tests one after the other

Expect[edit | edit source]

{: .-three-column}

Basic expectations[edit | edit source]

expect(value)
  .not
  .toBe(value)
  .toEqual(value)
  .toBeTruthy()

Note that toEqual is a deep equality check. See: expect()

Snapshots[edit | edit source]

expect(value)
  .toMatchSnapshot()
  .toMatchInlineSnapshot()

Note that toMatchInlineSnapshot() requires Prettier to be set up for the project. See: Inline snapshots

Errors[edit | edit source]

expect(value)
  .toThrow(error)
  .toThrowErrorMatchingSnapshot()

Booleans[edit | edit source]

expect(value)
  .toBeFalsy()
  .toBeNull()
  .toBeTruthy()
  .toBeUndefined()
  .toBeDefined()

Numbers[edit | edit source]

expect(value)
  .toBeCloseTo(number, numDigits)
  .toBeGreaterThan(number)
  .toBeGreaterThanOrEqual(number)
  .toBeLessThan(number)
  .toBeLessThanOrEqual(number)

Objects[edit | edit source]

expect(value)
  .toBeInstanceOf(Class)
  .toMatchObject(object)
  .toHaveProperty(keyPath, value)

Objects[edit | edit source]

expect(value)
  .toContain(item)
  .toContainEqual(item)
  .toHaveLength(number)

Strings[edit | edit source]

expect(value)
  .toMatch(regexpOrString)

Others[edit | edit source]

expect.extend(matchers)
expect.any(constructor)
expect.addSnapshotSerializer(serializer)

expect.assertions(1)

More features[edit | edit source]

Asynchronous tests[edit | edit source]

test('works with promises', () => {
  return new Promise((resolve, reject) => {
    ···
  })
})

{: data-line=“2”}

test('works with async/await', async () => {
  const hello = await foo()
  ···
})

{: data-line=“2”}

Return promises, or use async/await. See: Async tutorial

Snapshots[edit | edit source]

it('works', () => {
  const output = something()
  expect(output).toMatchSnapshot()
})

{: data-line=“3”}

First run creates a snapshot. Subsequent runs match the saved snapshot. See: Snapshot testing

React test renderer[edit | edit source]

import renderer from 'react-test-renderer'

{: .-setup}

it('works', () => {
  const tree = renderer.create(
    <Link page="http://www.facebook.com">Facebook</Link>
  ).toJSON()

  expect(tree).toMatchSnapshot()
})

{: data-line=“2,3,4”}

React’s test renderer can be used for Jest snapshots. See: Snapshot test

Timers[edit | edit source]

jest.useFakeTimers()
it('works', () => {
  jest.runOnlyPendingTimers()
  jest.runTimersToTime(1000)
  jest.runAllTimers()
})

See: Timer Mocks

Mock functions[edit | edit source]

Mock functions[edit | edit source]

const fn = jest.fn()
const fn = jest.fn(n => n * n)

See: Mock functions

Assertions[edit | edit source]

expect(fn)
  .toHaveBeenCalled()
  .toHaveBeenCalledTimes(number)
  .toHaveBeenCalledWith(arg1, arg2, ...)
  .toHaveBeenLastCalledWith(arg1, arg2, ...)
expect(fn)
  .toHaveBeenCalledWith(expect.anything())
  .toHaveBeenCalledWith(expect.any(constructor))
  .toHaveBeenCalledWith(expect.arrayContaining([ values ]))
  .toHaveBeenCalledWith(expect.objectContaining({ props }))
  .toHaveBeenCalledWith(expect.stringContaining(string))
  .toHaveBeenCalledWith(expect.stringMatching(regexp))

Instances[edit | edit source]

const Fn = jest.fn()

a = new Fn()
b = new Fn()
Fn.mock.instances
// → [a, b]

{: data-line=“1”}

See: .mock property

Calls[edit | edit source]

const fn = jest.fn()
fn(123)
fn(456)
fn.mock.calls.length   // → 2
fn.mock.calls[0][0]    // → 123
fn.mock.calls[1][0]    // → 456

{: data-line=“1,2,3”}

See: .mock property

Return values[edit | edit source]

const fn = jest.fn(() => 'hello')

or:[edit | edit source]

jest.fn().mockReturnValue('hello')
jest.fn().mockReturnValueOnce('hello')

Mock implementations[edit | edit source]

const fn = jest.fn()
  .mockImplementationOnce(() => 1)
  .mockImplementationOnce(() => 2)

{: data-line=“2,3”}

fn()    // → 1
fn()    // → 2

References[edit | edit source]

{: .-one-column}

Credit:rstacruz