Go back

Testing in JavaScript

10/10/2024

Testing in JavaScript: A Comprehensive Guide

Testing is essential for building reliable applications. Let's explore different types of testing and popular tools in the JavaScript ecosystem.

Types of Testing

Unit Testing

Test individual functions or components in isolation:

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

// sum.test.js
test("adds 1 + 2 to equal 3", () => {
  expect(sum(1, 2)).toBe(3);
});

Integration Testing

Test how different parts work together:

test("user can create and retrieve a post", async () => {
  const user = await createUser({ name: "John" });
  const post = await createPost({ title: "Test Post", userId: user.id });
  const retrievedPost = await getPost(post.id);

  expect(retrievedPost.title).toBe("Test Post");
  expect(retrievedPost.userId).toBe(user.id);
});

End-to-End Testing

Test complete user workflows:

// Using Cypress
describe("Blog App", () => {
  it("allows user to create a new post", () => {
    cy.visit("/");
    cy.get("[data-cy=create-post]").click();
    cy.get("[data-cy=title-input]").type("My New Post");
    cy.get("[data-cy=submit]").click();
    cy.contains("My New Post").should("be.visible");
  });
});

Popular Testing Tools

Jest

JavaScript testing framework with built-in mocking:

// Mock external dependencies
jest.mock("./api");

describe("UserService", () => {
  test("fetches user data", async () => {
    const mockUser = { id: 1, name: "John" };
    api.getUser.mockResolvedValue(mockUser);

    const user = await UserService.getUser(1);
    expect(user).toEqual(mockUser);
  });
});

React Testing Library

Test React components from the user's perspective:

import { render, screen, fireEvent } from "@testing-library/react";

test("button click increments counter", () => {
  render(<Counter />);
  const button = screen.getByRole("button", { name: /increment/i });

  fireEvent.click(button);
  expect(screen.getByText("Count: 1")).toBeInTheDocument();
});

Test-Driven Development (TDD)

  1. Red: Write a failing test
  2. Green: Write minimal code to pass
  3. Refactor: Improve the code while keeping tests green

Best Practices

Good testing practices lead to more confident deployments and better code quality!