Node.jsのモックとテストダブル
モック、スタブ、スパイで実際の依存関係を置き換え、テスト対象のコードを分離する方法を学びます。高速で決定論的なユニットテストを実現できます。
「Node.jsのモックとテストダブル」はCoddyKit上の無料Node.js Backend Development Bootcampレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはNode.js Backend Development Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Node.js Backend Development Bootcampコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
The Problem with Real Dependencies
A unit test should check one piece of logic in isolation. But real code calls databases, APIs, the clock, and the file system — all slow, flaky, and unpredictable.
Test doubles replace those dependencies with controllable fakes.
Types of Test Doubles
Common terms you will hear:
- Stub: returns a canned value
- Spy: records how it was called
- Mock: a stub + spy with built-in expectations
- Fake: a lightweight working implementation
Creating a Mock Function
In Jest, jest.fn() creates a mock function. It records every call and lets you assert on them later.
const callback = jest.fn();
callback('hello');
expect(callback).toHaveBeenCalledWith('hello');Defining Return Values
Tell a mock what to return with mockReturnValue, or for async code use mockResolvedValue to resolve a promise.
const getUser = jest.fn().mockResolvedValue({ id: 1, name: 'Ada' });
const user = await getUser();
expect(user.name).toBe('Ada');Asserting on Calls
Spies let you verify interactions:
toHaveBeenCalled()toHaveBeenCalledTimes(n)toHaveBeenCalledWith(args)
const save = jest.fn();
save({ id: 1 });
expect(save).toHaveBeenCalledTimes(1);Mocking a Module
To replace an entire imported module, use jest.mock(). Every export becomes an auto-mock you can configure per test.
jest.mock('./mailer');
const mailer = require('./mailer');
mailer.send.mockResolvedValue(true);Spying on Existing Methods
Sometimes you want to watch a real method without replacing it. jest.spyOn() wraps an existing method so you can assert and optionally override it.
const spy = jest.spyOn(console, 'log');
console.log('hi');
expect(spy).toHaveBeenCalledWith('hi');Resetting Between Tests
Mocks accumulate state. Reset them between tests so calls from one test do not leak into another.
mockClear()clears call datamockReset()also clears implementations
afterEach(() => {
jest.clearAllMocks();
});Mocking Time
Tests that depend on the current time are flaky. Jest fake timers let you control the clock so timeouts and dates are deterministic.
jest.useFakeTimers();
const fn = jest.fn();
setTimeout(fn, 1000);
jest.advanceTimersByTime(1000);
expect(fn).toHaveBeenCalled();Dependency Injection Makes Mocking Easy
Code that receives its dependencies as arguments is far easier to test than code that imports them directly. Design for testability.
function createService(db) {
return { getUser: id => db.find(id) };
}
const fakeDb = { find: jest.fn().mockReturnValue({ id: 1 }) };
const svc = createService(fakeDb);Don't Over-Mock
Mocking too much produces tests that only confirm your mocks were called — not that the code works. Mock external boundaries (DB, network), but test real logic directly when you can.
Quick Check
Test your understanding of test doubles.
Recap
You learned to isolate code with test doubles:
- Create mocks with
jest.fn()and configure return values - Replace modules with
jest.mock() - Watch real methods with
jest.spyOn() - Reset mocks between tests and control time with fake timers
- Inject dependencies for testability and avoid over-mocking
Good mocking keeps unit tests fast, reliable, and focused.
よくある質問
「Node.jsのモックとテストダブル」レッスンは無料ですか?
はい。「Node.jsのモックとテストダブル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Node.js Backend Development Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Node.js Backend Development Bootcampコースには全4レッスンが含まれています。
「Node.jsのモックとテストダブル」で何を学びますか?
モック、スタブ、スパイで実際の依存関係を置き換え、テスト対象のコードを分離する方法を学びます。高速で決定論的なユニットテストを実現できます。 ブラウザで直接実行するハンズオンコードでNode.js Backend Development Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Node.js Backend Development Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのNode.js Backend Development Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Node.jsのモックとテストダブル」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このNode.js Backend Development Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのNode.js Backend Development Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Jestによるユニットテスト
- APIエンドポイントの結合テスト
- 効果的なデバッグ手法
- Node.jsのモックとテストダブル