Go back

Setting Up Jest Testing in Your Node.js Application: A Complete Guide

Nov 8, 2024

Learn how to set up Jest in your Node.js project to write and run tests for JavaScript applications.


Jest is a popular testing framework maintained by Facebook that makes it easy to write and run tests for JavaScript applications. This guide will walk you through setting up Jest in your Node.js project from scratch.

Prerequisites

  • Node.js installed on your system
  • An existing Node.js project or a new one

Step 1: Initialize Your Project

If you don't have an existing project, create a new directory and initialize it:

mkdir my-node-project
cd my-node-project
npm init -y

Step 2: Install Jest

Install Jest as a development dependency:

npm install --save-dev jest

Step 3: Configure Jest in package.json

Update your package.json to add Jest configuration and test script:

{
  "scripts": {
    "test": "jest",
    "test:watch": "jest --watch"
  },
  "jest": {
    "testEnvironment": "node",
    "coveragePathIgnorePatterns": [
      "/node_modules/"
    ],
    "moduleFileExtensions": ["js", "json"],
    "testMatch": ["**/__tests__/**/*.js", "**/?(*.)+(spec|test).js"],
    "verbose": true
  }
}

Step 4: Create a Sample Function to Test

Create a new file called math.js:

// math.js
function sum(a, b) {
  return a + b;
}

function multiply(a, b) {
  return a * b;
}

module.exports = {
  sum,
  multiply
};

Step 5: Write Your First Test

Create a test file called math.test.js:

// math.test.js
const { sum, multiply } = require('./math');

describe('Math functions', () => {
  test('adds 1 + 2 to equal 3', () => {
    expect(sum(1, 2)).toBe(3);
  });

  test('multiplies 3 * 4 to equal 12', () => {
    expect(multiply(3, 4)).toBe(12);
  });
});

Step 6: Additional Jest Configuration (Optional)

Create a jest.config.js file for more detailed configuration:

// jest.config.js
module.exports = {
  // Automatically clear mock calls and instances between every test
  clearMocks: true,

  // Indicates whether the coverage information should be collected while executing the test
  collectCoverage: true,

  // The directory where Jest should output its coverage files
  coverageDirectory: "coverage",

  // An array of regexp pattern strings used to skip coverage collection
  coveragePathIgnorePatterns: [
    "/node_modules/"
  ],

  // The test environment that will be used for testing
  testEnvironment: "node",

  // The glob patterns Jest uses to detect test files
  testMatch: [
    "**/__tests__/**/*.[jt]s?(x)",
    "**/?(*.)+(spec|test).[tj]s?(x)"
  ]
};

Step 7: Running Tests

You can now run your tests using npm:

# Run all tests
npm test

# Run tests in watch mode
npm run test:watch

# Run tests with coverage report
npm test -- --coverage

Common Jest Matchers

Here are some commonly used Jest matchers:

// Exact equality
expect(value).toBe(2);

// Object matching
expect(data).toEqual({id: 1});

// Truthiness
expect(value).toBeTruthy();
expect(value).toBeFalsy();

// Numbers
expect(value).toBeGreaterThan(3);
expect(value).toBeLessThan(5);

// Strings
expect(string).toMatch(/pattern/);

// Arrays
expect(array).toContain(item);

// Exceptions
expect(() => {
  throw new Error('Wrong!');
}).toThrow('Wrong!');

Testing Asynchronous Code

Jest handles async code testing gracefully:

// Testing Promises
test('async test', () => {
  return fetchData().then(data => {
    expect(data).toBe('data');
  });
});

// Using async/await
test('async test with async/await', async () => {
  const data = await fetchData();
  expect(data).toBe('data');
});

Best Practices

  1. File Organization: Keep test files close to the code they're testing

    src/
      ├── math.js
      └── __tests__/
          └── math.test.js
    
  2. Test Isolation: Each test should be independent and not rely on other tests

  3. Meaningful Descriptions: Use clear test descriptions

    describe('User authentication', () => {
      test('should successfully log in with valid credentials', () => {
        // test code
      });
    });
    
  4. Setup and Teardown: Use Jest's lifecycle methods when needed

    beforeAll(() => {
      // Setup before all tests
    });
    
    afterEach(() => {
      // Cleanup after each test
    });
    

Conclusion

You now have a fully configured Jest testing environment in your Node.js application. Remember to:

  • Write tests as you develop new features
  • Aim for high test coverage
  • Run tests frequently
  • Keep tests maintainable and readable

Your tests will help catch bugs early, serve as documentation, and make refactoring easier.