I am attempting to use Jest for my Node Js Test (specifically AWS's Lambda) but I am having difficulty mocking async await functionality.
I am using babel-jest and jest-cli. Below are my modules. I am getting to the first console.log, but the second console.log returns undefined and my test crash.
Any ideas on how to implement this?
Below is my module:
import {callAnotherFunction} from '../../../utils';
export const handler = async (event, context, callback) => {
const {emailAddress, emailType} = event.body;
console.log("**** GETTING HERE = 1")
const sub = await callAnotherFunction(emailAddress, emailType);
console.log("**** Not GETTING HERE = 2", sub) // **returns undefined**
// do something else here
callback(null, {success: true, returnValue: sub})
}
My Test
import testData from '../data.js';
import { handler } from '../src/index.js';
jest.mock('../../../utils');
beforeAll(() => {
const callAnotherLambdaFunction= jest.fn().mockReturnValue(Promise.resolve({success: true}));
});
describe('>>> SEND EMAIL LAMBDA', () => {
test('returns a good value', done => {
function callback(dataTest123) {
expect(dataTest123).toBe({success: true, returnValue: sub);
done();
}
handler(testData, null, callback);
},10000);
})
I am attempting to use Jest for my Node Js Test (specifically AWS's Lambda) but I am having difficulty mocking async await functionality.
I am using babel-jest and jest-cli. Below are my modules. I am getting to the first console.log, but the second console.log returns undefined and my test crash.
Any ideas on how to implement this?
Below is my module:
import {callAnotherFunction} from '../../../utils';
export const handler = async (event, context, callback) => {
const {emailAddress, emailType} = event.body;
console.log("**** GETTING HERE = 1")
const sub = await callAnotherFunction(emailAddress, emailType);
console.log("**** Not GETTING HERE = 2", sub) // **returns undefined**
// do something else here
callback(null, {success: true, returnValue: sub})
}
My Test
import testData from '../data.js';
import { handler } from '../src/index.js';
jest.mock('../../../utils');
beforeAll(() => {
const callAnotherLambdaFunction= jest.fn().mockReturnValue(Promise.resolve({success: true}));
});
describe('>>> SEND EMAIL LAMBDA', () => {
test('returns a good value', done => {
function callback(dataTest123) {
expect(dataTest123).toBe({success: true, returnValue: sub);
done();
}
handler(testData, null, callback);
},10000);
})
Share
Improve this question
edited Sep 19, 2019 at 15:20
cse
4,1042 gold badges22 silver badges38 bronze badges
asked Jul 18, 2017 at 13:52
andreandre
1,6804 gold badges19 silver badges31 bronze badges
2 Answers
Reset to default 6You should be careful about somethings below:
Import your
utils
as a module then mockcallAnotherLambdaFunction
functionMock return value of
callAnotherLambdaFunction
withResolve
andReject
case https://jestjs.io/docs/en/mock-function-api.html#mockfnmockresolvedvaluevalue
This is my example:
import testData from '../data.js';
import { handler } from '../src/index.js';
import * as Utils from '../../../utils'
jest.mock('../../../utils');
beforeAll(() => {
Utils.callAnotherLambdaFunction = jest.fn().mockResolvedValue('test');
});
describe('>>> SEND EMAIL LAMBDA', () => {
it('should return a good value', async () => {
const callback = jest.fn()
await handler(testData, null, callback);
expect(callback).toBeCalledWith(null, {success: true, returnValue: 'test'})
});
})
jest.mock('../../../utils');
is fine, But you are not actually mocking the implementation, you have to implement the behaviour yourself.
So you need to add
import { callAnotherFunction } from '../../../utils';
callAnotherFunction.mockImplementation(() => Promise.resolve('someValue'));
test('test' , done => {
const testData = {
body: {
emailAddress: 'email',
emailType: 'type'
}
};
function callback(dataTest123) {
expect(dataTest123).toBe({success: true, returnValue: 'someValue');
done();
}
handler(testData, null, callback);
});
Hope this helps.