I have this class:
class DataService {
constructor() {
}
async CreateItem() {
try {
return {data: true, error: null}
} catch (error) {
return {data: null, error: error}
}
}
async SendToAnalytics() {
try {
return {data: true, error: null}
} catch (error) {
return {data: null, error: error}
}
}
async SendEmail() {
try {
return {data: true, error: null}
} catch (error) {
return {data: null, error: error}
}
}
}
module.exports = DataService;
And I am calling these methods in my Lambda handler:
const DataService = require("../services/data.service");
exports.handler = async (event) => {
try {
const dataService = new DataService();
const createItem = await dataService.CreateItem();
if (createItem.error) {
return {statusCode: 500};
}
const sendToAnalytics = await dataService.SendToAnalytics();
if (sendToAnalytics.error) {
return {statusCode: 500};
}
const sendEmail = await dataService.SendEmail();
if (sendEmail.error) {
return {statusCode: 500};
}
return {statusCode: 200};
} catch (e) {
return {statusCode: 500};
}
};
I would like to cover 100 percent of the code and this is my handler.spec file
const { handler } = require("./handler");
const DataService = require("../services/data.service");
jest.mock("../services/data.service", () => {
return jest.fn().mockImplementation(() => {
return {
CreateItem: jest.fn(() => ({ data: true, error: null })),
SendToAnalytics: jest.fn(() => ({ data: true, error: null })),
SendEmail: jest.fn(() => ({ data: true, error: null })),
};
});
});
const dataService = new DataService();
describe("Job Apply Handler", () => {
afterAll(() => {
jest.resetAllMocks();
});
it("Successful response", async () => {
const res = await handler();
expect(res.statusCode).toEqual(200);
});
it("Error Response because of CreateItem Error", async () => {
dataService.SaveApplicant.mockImplementationOnce(
jest.fn(() => ({ data: null, error: true }))
);
const res = await handler();
expect(res.statusCode).toEqual(500);
});
it("Error Response because of SendToAnalytics Error", async () => {
dataService.SendToAnalytics.mockImplementationOnce(
jest.fn(() => ({ data: null, error: true }))
);
//DOES NOT ENTER inside if(sendToAnalyticsError)
// CreateItem is still mocked to return error: true
const res = await handler();
expect(res.statusCode).toEqual(500);
});
it("Error Response because of SendEmail Error", async () => {
dataService.SendToAnalytics.mockImplementationOnce(
jest.fn(() => ({ data: null, error: true }))
);
//DOES NOT ENTER inside if(sendEmail.error)
// CreateItem is still mocked to return error: true
const res = await handler();
expect(res.statusCode).toEqual(500);
});
it("Error Response because of Exception", async () => {
dataService.SendToAnalytics.mockImplementationOnce(
jest.fn(() => {
throw new Error("error");
})
);
const res = await handler();
expect(res.statusCode).toEqual(500);
});
});
However, all mockImplementationOnce() are applied on the first method of the class. I guess I am mocking the methods wrong. Since I cant reset CreateItem() after is mocked to return error and all other cases end up in the first IF statement. This is Jest documentation reference
Any suggestions ?