Skip to content

Commit 85fad97

Browse files
committed
Adding async utility versions of mockReturnValue & mockreturnValueOnce
1 parent 8b46fa8 commit 85fad97

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

packages/jest-mock/src/__tests__/jest_mock.test.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,55 @@ describe('moduleMocker', () => {
391391
expect(fake(2)).toEqual(4);
392392
});
393393

394+
it('supports mocking resolvable async functions', () => {
395+
const fn = moduleMocker.fn();
396+
fn.mockResolvedValue('abcd');
397+
398+
const promise = fn();
399+
400+
expect(promise).toBeInstanceOf(Promise);
401+
402+
return promise.then(value => expect(value).toBe('abcd'));
403+
});
404+
405+
it('supports mocking resolvable async functions only once', () => {
406+
const fn = moduleMocker.fn();
407+
fn.mockResolvedValue('abcd');
408+
fn.mockResolvedValueOnce('abcde');
409+
410+
const promise1 = fn().then(value => expect(value).toBe('abcde'));
411+
const promise2 = fn().then(value => expect(value).toBe('abcd'));
412+
413+
return Promise.all([promise1, promise2]);
414+
});
415+
416+
it('supports mocking rejectable async functions', () => {
417+
const err = new Error('rejected');
418+
const fn = moduleMocker.fn();
419+
fn.mockRejectedValue(err);
420+
421+
const promise = fn();
422+
423+
expect(promise).toBeInstanceOf(Promise);
424+
425+
return promise.catch(rejection => expect(rejection).toBe(err));
426+
});
427+
428+
it('supports mocking rejectable async functions only once', () => {
429+
const defaultErr = new Error('default rejected');
430+
const err = new Error('rejected');
431+
const fn = moduleMocker.fn();
432+
fn.mockRejectedValue(defaultErr);
433+
fn.mockRejectedValueOnce(err);
434+
435+
const promise1 = fn().catch(rejection => expect(rejection).toBe(err));
436+
const promise2 = fn().catch(rejection =>
437+
expect(rejection).toBe(defaultErr),
438+
);
439+
440+
return Promise.all([promise1, promise2]);
441+
});
442+
394443
describe('timestamps', () => {
395444
const RealDate = Date;
396445

packages/jest-mock/src/index.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,17 @@ function getSlots(object?: Object): Array<string> {
227227
return Object.keys(slots);
228228
}
229229

230+
function wrapAsyncParam(
231+
fn: any => any,
232+
asyncAction: 'resolve' | 'reject',
233+
): any => any {
234+
if (asyncAction === 'reject') {
235+
return value => fn(Promise.reject(value));
236+
}
237+
238+
return value => fn(Promise.resolve(value));
239+
}
240+
230241
class ModuleMockerClass {
231242
_environmentGlobal: Global;
232243
_mockState: WeakMap<Function, MockFunctionState>;
@@ -407,6 +418,13 @@ class ModuleMockerClass {
407418
return f;
408419
};
409420

421+
f.mockResolvedValueOnce = wrapAsyncParam(
422+
f.mockReturnValueOnce,
423+
'resolve',
424+
);
425+
426+
f.mockRejectedValueOnce = wrapAsyncParam(f.mockReturnValueOnce, 'reject');
427+
410428
f.mockReturnValue = value => {
411429
// next function call will return specified return value or this one
412430
const mockConfig = this._ensureMockConfig(f);
@@ -415,6 +433,10 @@ class ModuleMockerClass {
415433
return f;
416434
};
417435

436+
f.mockResolvedValue = wrapAsyncParam(f.mockReturnValue, 'resolve');
437+
438+
f.mockRejectedValue = wrapAsyncParam(f.mockReturnValue, 'reject');
439+
418440
f.mockImplementationOnce = fn => {
419441
// next function call will use this mock implementation return value
420442
// or default mock implementation return value

0 commit comments

Comments
 (0)