10/10/2024
Testing is essential for building reliable applications. Let's explore different types of testing and popular tools in the JavaScript ecosystem.
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);
});
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);
});
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");
});
});
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);
});
});
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();
});
Good testing practices lead to more confident deployments and better code quality!