Day 64

Mocking & Spies

11 min
JavaScript 100 Days

Mocking means real implementations ki jagah fake ones use karna. Spies track karte hain ke function kab call hua, kitni baar, kya arguments ke saath. Real dependencies (DB, API, email) se tests isolate hote hain.

jest.fn() Mocks

Fake functions banao aur track karo.

mocks.test.js
javascript
// Mock function
const mockSendEmail = jest.fn();
mockSendEmail.mockReturnValue(true);
mockSendEmail.mockResolvedValue({ sent: true }); // async

// Use in test
mockSendEmail("user@test.com", "Welcome!");

expect(mockSendEmail).toHaveBeenCalledTimes(1);
expect(mockSendEmail).toHaveBeenCalledWith("user@test.com", "Welcome!");
expect(mockSendEmail).toHaveBeenLastCalledWith("user@test.com", "Welcome!");

// jest.spyOn — existing function spy karo
const consoleSpy = jest.spyOn(console, "log");

someFunction(); // jiske andar console.log hai

expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore(); // original restore karo

Mock Modules

Entire modules mock karo.

module-mock.test.js
javascript
// email.js module mock karo
jest.mock("./email", () => ({
  sendEmail: jest.fn().mockResolvedValue({ id: "msg-123" }),
  sendBulk: jest.fn().mockResolvedValue([])
}));

const { sendEmail } = require("./email");

test("user registration sends welcome email", async () => {
  await registerUser({ name: "Ali", email: "ali@test.com" });
  
  expect(sendEmail).toHaveBeenCalledWith(
    "ali@test.com",
    expect.stringContaining("Welcome")
  );
});

🎯 Practice Challenge

Payment service ke saath registerUser test karo. Payment mock karo — success case aur failure case dono test karo.