I wanted to write test cases for my Api file using Jest. That uses Next.js. I tried many things but was not able to get any coverage of file.
ApiFile.js
const axios = require('axios');
import getConfig from 'next/config';
export default async (req, res) => {
const {query: { param }} = req;
const response = await customerInfo(param);
if (!response.data || response.data == null)
res.status(200).send({ data: [], status: response.status});
else
res.status(200).send({ data: response.data.results, status: response.status });
};
async function customerInfo(params) {
const { serverRuntimeConfig } = getConfig();
const URL = serverRuntimeConfig.API;
const config = {
timeout: 15000,
headers: {
'content-type': 'application/json'
},
};
const customer_id = params[0];
const url = `${URL}/customer/${customer_id}`;
return await axios
.get(`${url}`, config)
.then(response => {
return response
})
.catch(function(error) {
throw error;
});
}
TestFile.js
import mockAxios from "axios";
import mockData from "./customerMock.json";
import customerInfo from "../[...param]";
describe('fetchData', () => {
it('fetches successfully data from an API', async () => {
const data = mockData.data;
jest.spyOn(mockAxios, 'default');
const endpoint = '${URL}/customer/abcdef';
const method = 'get';
const params = {
customer_id : 'abcdef'
}
customerInfo(params);
expect(mockAxios.default).toBeCalledWith(params);
});
it('fetches erroneously data from an API', async () => {
const errorMessage = 'Network Error';
mockAxios.get.mockImplementationOnce(() =>
Promise.reject(new Error(errorMessage)),
);
await expect(customerInfo('react')).rejects.toThrow(errorMessage);
});
});
I have tried many ways. Any reference or suggestion will work. Thanks in advance
Here's an example of how I unit tested a flight data API using Jest and next-test-api-route-handler
, a package (I created!) for writing unit tests for Next API routes. My tests are structured very similarly to your own.
To generate coverage data through Jest (assuming you have Node installed), I run the following command:
npx jest --coverage --collectCoverageFrom 'src/**/*.ts' --collectCoverageFrom 'lib/**/*.ts'
Specifically, --coverage
tells Jest to collect coverage data, usually into the directory ./coverage
, and the optional --collectCoverageFrom X
tells Jest to collect coverage only from a specific directory (or directories if multiple are specified).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With