Skip to main content

Mocks

Mocks are dummy objects simulating behaviour of more complicated real world objects. Earl supports only function mocks for now.

Creating typesafe mocks

Mocks are basically a dummy functions which are easy to control and their usage can be inspected later.

To create a mock do:

import { mockFn } from 'earljs'

// mock: Mock<[number, number], number>
const mock = mockFn<[number, number], number>()

This creates a mock function expecting two numbers as an input and returning another number. As with everything in earl, we try to be fully typesafe, that's why you need to pass type arguments between angle brackets <, >.

Alternatively, you can pass function type as a type argument:

// mock: Mock.Of<(a: number, b: number) => number>
const mock = mockFn<(a: number, b: number) => number>()

If you leave out type arguments both input and output of the mock will be typed as any.

Configuring mocks

Mocks in earl needs to be configured first, if you call this mock now you will get MockNotConfigured Error.

import { mockFn } from 'earljs'

const mock = mockFn<[number, number], number>()
mock.returns(42) // make it always return 42

console.log(mock(2, 2)) // 42
console.log(mock(2, 2)) // 42
console.log(mock(2, 2)) // 42

// when called with args 2 and 2 return 4
mock.given(2, 2).returnsOnce(4)

console.log(mock(2, 2)) // 4

There are various ways of configuring mocks, explore all of them in API reference.

Asserting mocks

earl provides a couple of validators to work with mocks:

const mock = mockFn<[number, number], number>()
mock.returns(42) // make it always return 42

mock(2, 2)

// expect that it was called with 2 and 2
expect(mock).toHaveBeenCalledWith([2, 2])

// expect that it was exactly once with 2 and 2
expect(mock).toHaveBeenCalledExactlyWith([[2, 2]])

Alternatively to toHaveBeenCalledExactlyWith and toHaveBeenCalledWith, you can define all expected arguments using given and assert they were passed with toBeExhausted.

const mock = mockFn<(_: number) => number>()
.given(2)
.returnsOnce(4)
.given(3)
.returnsOnce(9)

expect(mock).toBeExhausted()

Learn more from API reference.