Skip to content

Commit

Permalink
feat(jest-mock): add mockFn.mock.lastCall to retrieve last argument (
Browse files Browse the repository at this point in the history
  • Loading branch information
Biki-das committed Feb 5, 2022
1 parent 8a62d98 commit b2db6cf
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -2,6 +2,8 @@

### Features

- `[jest-mock]` Added `mockFn.mock.lastCall` to retrieve last argument ([#12285](https://github.com/facebook/jest/pull/12285))

### Fixes

- `[expect]` Add a fix for `.toHaveProperty('')` ([#12251](https://github.com/facebook/jest/pull/12251))
Expand Down
10 changes: 10 additions & 0 deletions docs/MockFunctionAPI.md
Expand Up @@ -79,6 +79,16 @@ mockFn.mock.instances[0] === a; // true
mockFn.mock.instances[1] === b; // true
```

### `mockFn.mock.lastCall`

An array containing the call arguments of the last call that was made to this mock function. If the function was not called, it will return `undefined`.

For example: A mock function `f` that has been called twice, with the arguments `f('arg1', 'arg2')`, and then with the arguments `f('arg3', 'arg4')`, would have a `mock.lastCall` array that looks like this:

```js
['arg3', 'arg4'];
```

### `mockFn.mockClear()`

Clears all information stored in the [`mockFn.mock.calls`](#mockfnmockcalls), [`mockFn.mock.instances`](#mockfnmockinstances) and [`mockFn.mock.results`](#mockfnmockresults) arrays. Often this is useful when you want to clean up a mocks usage data between two assertions.
Expand Down
3 changes: 3 additions & 0 deletions docs/MockFunctions.md
Expand Up @@ -75,6 +75,9 @@ expect(someMockFunction.mock.instances.length).toBe(2);
// The object returned by the first instantiation of this function
// had a `name` property whose value was set to 'test'
expect(someMockFunction.mock.instances[0].name).toEqual('test');

// The first argument of the last call to the function was 'test'
expect(someMockFunction.mock.lastCall[0]).toBe('test');
```

## Mock Return Values
Expand Down
26 changes: 26 additions & 0 deletions packages/jest-mock/src/__tests__/index.test.ts
Expand Up @@ -1064,6 +1064,32 @@ describe('moduleMocker', () => {
expect(fn.getMockName()).toBe('myMockFn');
});

test('jest.fn should provide the correct lastCall', () => {
const mock = jest.fn();

expect(mock.mock).not.toHaveProperty('lastCall');

mock('first');
mock('second');
mock('last', 'call');

expect(mock).toHaveBeenLastCalledWith('last', 'call');
expect(mock.mock.lastCall).toEqual(['last', 'call']);
});

test('lastCall gets reset by mockReset', () => {
const mock = jest.fn();

mock('first');
mock('last', 'call');

expect(mock.mock.lastCall).toEqual(['last', 'call']);

mock.mockReset();

expect(mock.mock).not.toHaveProperty('lastCall');
});

test('mockName gets reset by mockReset', () => {
const fn = jest.fn();
expect(fn.getMockName()).toBe('jest.fn()');
Expand Down
7 changes: 7 additions & 0 deletions packages/jest-mock/src/index.ts
Expand Up @@ -166,6 +166,10 @@ type MockFunctionState<T, Y extends Array<unknown>> = {
calls: Array<Y>;
instances: Array<T>;
invocationCallOrder: Array<number>;
/**
* Getter for retrieving the last call arguments
*/
lastCall?: Y;
/**
* List of results of calls to the mock function.
*/
Expand Down Expand Up @@ -516,6 +520,9 @@ export class ModuleMocker {
state = this._defaultMockState();
this._mockState.set(f, state);
}
if (state.calls.length > 0) {
state.lastCall = state.calls[state.calls.length - 1];
}
return state;
}

Expand Down

0 comments on commit b2db6cf

Please sign in to comment.