How do you write unit tests for JavaScript code?
TL;DR
To write unit tests for JavaScript code, you typically use a testing framework like Jest or Mocha. First, you set up your testing environment by installing the necessary libraries. Then, you write test cases using functions like describe, it, or test to define your tests. Each test case should focus on a small, isolated piece of functionality. You use assertions to check if the output of your code matches the expected result.
Example using Jest:
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
// sum.test.js
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});Setting up the testing environment
Installing Jest
To get started with Jest, you need to install it via npm:
npm install --save-dev jestConfiguring Jest
Add a script to your package.json to run Jest:
{
"scripts": {
"test": "jest"
}
}Writing test cases
Basic structure
A test file typically contains one or more describe blocks, which group related tests, and it or test blocks, which define individual test cases.
Example:
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
// sum.test.js
const sum = require('./sum');
describe('sum function', () => {
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
test('adds -1 + 1 to equal 0', () => {
expect(sum(-1, 1)).toBe(0);
});
});Using assertions
Assertions are used to check if the output of your code matches the expected result. Jest provides various assertion methods like toBe, toEqual, toBeNull, etc.
Example:
test('object assignment', () => {
const data = { one: 1 };
data['two'] = 2;
expect(data).toEqual({ one: 1, two: 2 });
});Mocking dependencies
Sometimes, you need to mock dependencies to isolate the unit of code you are testing. Jest provides functions like jest.fn() and jest.mock() for this purpose.
Example:
// fetchData.js
const fetch = require('node-fetch');
async function fetchData(url) {
const response = await fetch(url);
return response.json();
}
module.exports = fetchData;
// fetchData.test.js
const fetchData = require('./fetchData');
const fetch = require('node-fetch');
jest.mock('node-fetch');
test('fetches data from API', async () => {
const mockResponse = { data: '12345' };
fetch.mockResolvedValueOnce({
json: async () => mockResponse,
});
const data = await fetchData('https://api.example.com/data');
expect(data).toEqual(mockResponse);
});Running the tests
To run your tests, use the following command:
npm test