I know that npm request module is now deprecated, but i want to mock a post http call with jest.
Here is my function
import { post } from 'request';
export functionToFetch(uriFetching) {
return post(
{
url: uriFetching,
headers: {},
json,
},
(error, response, body) => {
if (error) {
console.log('error)
// return specific code
}
// return success code
}
}
And in try this in my test :
import { post } from 'request';
import {functionToFetch} from './example';
it('should do some specific handling on error', () => {
const fakeURI = 'http://example.com'
request.post = jest.fn().mockImplementation(() => Promise.resolve(new Response('test')));
// on error
expect(functionToFetch(fakeURI).toEqual(expected);
// on success
expect(functionToFetch(fakeURI).toEqual(expected2);
});
But it returns TypeError: Cannot set property ‘post’ of undefined
I want to mock that method to handle error and response to test methods inside them
Advertisement
Answer
Use jest.mock() and post.mockImplementation() will do this. You can get the actual callback function passed in post function in your test case. And execute it manually with mocked arguments.
E.g.
index.js:
import { post } from 'request';
export function functionToFetch(uriFetching) {
const json = {};
post({ url: uriFetching, headers: {}, json }, (error, response, body) => {
if (error) {
console.log(error);
} else {
console.log(response);
}
});
}
index.test.js:
import { functionToFetch } from '.';
import { post } from 'request';
jest.mock('request');
describe('67210149', () => {
afterAll(() => {
jest.resetAllMocks();
});
it('should do some specific handling on error', () => {
const mError = new Error('network');
post.mockImplementation((option, callback) => {
callback(mError);
});
const logSpy = jest.spyOn(console, 'log');
const fakeURI = 'http://example.com';
functionToFetch(fakeURI);
expect(logSpy).toBeCalledWith(mError);
expect(post).toBeCalledWith({ url: 'http://example.com', headers: {}, json: {} }, expect.any(Function));
});
});
unit test result:
PASS examples/67210149/index.test.js (7.274 s)
67210149
✓ should do some specific handling on error (24 ms)
console.log
Error: network
at Object.<anonymous> (/Users/dulin/workspace/github.com/mrdulin/jest-v26-codelab/examples/67210149/index.test.js:8:20)
at Object.asyncJestTest (/Users/dulin/workspace/github.com/mrdulin/jest-v26-codelab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
at /Users/dulin/workspace/github.com/mrdulin/jest-v26-codelab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
at new Promise (<anonymous>)
at mapper (/Users/dulin/workspace/github.com/mrdulin/jest-v26-codelab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
at /Users/dulin/workspace/github.com/mrdulin/jest-v26-codelab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at console.<anonymous> (node_modules/jest-environment-enzyme/node_modules/jest-mock/build/index.js:866:25)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 7.836 s, estimated 8 s