المحاكاة والبدائل الاختبارية في Node.js
تعلّم كيفية عزل الشيفرة قيد الاختبار باستبدال الاعتماديات الفعلية ببدائل محاكاة وبدائل وهمية وأدوات تجسس، للحفاظ على سرعة اختبارات الوحدة وقابليتها للتكرار.
المحاكاة والبدائل الاختبارية في Node.js درس مجاني في Node.js Backend Development Bootcamp على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في 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/7) وفتح باقي دورة Node.js Backend Development Bootcamp، انتقل إلى CoddyKit PRO. تتضمن دورة Node.js Backend Development Bootcamp 4 دروس في المجموع.
ماذا ستتعلم في «المحاكاة والبدائل الاختبارية في Node.js»؟
تعلّم كيفية عزل الشيفرة قيد الاختبار باستبدال الاعتماديات الفعلية ببدائل محاكاة وبدائل وهمية وأدوات تجسس، للحفاظ على سرعة اختبارات الوحدة وقابليتها للتكرار. تتمرن على Node.js Backend Development Bootcamp مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Node.js Backend Development Bootcamp؟
لا تُشترط خبرة سابقة. Node.js Backend Development Bootcamp على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «المحاكاة والبدائل الاختبارية في Node.js»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Node.js Backend Development Bootcamp هذا؟
نعم. كل درس في Node.js Backend Development Bootcamp يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- اختبار الوحدات باستخدام Jest
- اختبار التكامل لنقاط API
- تقنيات فعّالة لتصحيح الأخطاء
- المحاكاة والبدائل الاختبارية في Node.js