بدائل الاختبار: Mocks وStubs
الواجهات لتحسين قابلية الاختبار وحقن التبعيات
بدائل الاختبار: Mocks وStubs درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
نظرة عامة على بدائل الاختبار
يستبدل بديل الاختبار تبعيةً حقيقيةً أثناء الاختبارات. الأنواع هي: stub (يعيد استجابات محددة مسبقًا)، وmock (يتحقق من التفاعلات)، وspy (يسجل الاستدعاءات)، وfake (تطبيق عملي داخل الذاكرة).
الواجهات تتيح بدائل الاختبار
صمّم الدوال بحيث تقبل واجهات بدلًا من أنواع ملموسة. مرّر التطبيق الحقيقي في بيئة الإنتاج، وبديل اختبار في الاختبارات.
type UserStore interface {
FindByID(id int) (*User, error)
}
func GetUser(store UserStore, id int) (*User, error) {
return store.FindByID(id)
}Stub يدوي
الـ stub هو بنية بسيطة تطبّق واجهةً وتعيد قيمًا مُعدّة مسبقًا:
type stubStore struct{ user *User; err error }
func (s *stubStore) FindByID(_ int) (*User, error) { return s.user, s.err }
// In test:
store := &stubStore{user: &User{Name: "Alice"}}
result, _ := GetUser(store, 1)Mock يدوي
يسجل الـ mock الاستدعاءات ويتحقق منها:
type mockStore struct {
called bool
gotID int
user *User
}
func (m *mockStore) FindByID(id int) (*User, error) {
m.called = true; m.gotID = id
return m.user, nil
}
// Assert: if !mock.called { t.Error(...) }testify/mock
تنشئ حزمة testify/mock كائنات mock أو تتيح كتابتها، مع توقعات الاستدعاءات وتهيئة قيم الإرجاع:
type MockStore struct { mock.Mock }
func (m *MockStore) FindByID(id int) (*User, error) {
args := m.Called(id)
return args.Get(0).(*User), args.Error(1)
}
// In test:
m := new(MockStore)
m.On("FindByID", 1).Return(&User{}, nil)
m.AssertExpectations(t)gomock
تنشئ go.uber.org/mock/gomock (المعروفة سابقًا باسم golang/mock) كائنات mock من الواجهات. استخدم واجهة سطر الأوامر mockgen لإنشائها، واستخدم EXPECT() لتعيين التوقعات.
Fake
الـ fake هو تطبيق عملي يعمل داخل الذاكرة. مثلًا: مخزن مستخدمين داخل الذاكرة يخزّن المستخدمين في خريطة. تتطلب Fakes جهدًا أكبر في الكتابة، لكنها أكثر واقعية وأقل هشاشة من Mocks.
type fakeStore struct{ users map[int]*User }
func (f *fakeStore) FindByID(id int) (*User, error) {
u, ok := f.users[id]
if !ok { return nil, ErrNotFound }
return u, nil
}httptest لعملاء HTTP
توفر net/http/httptest خادم اختبار HTTP داخل العملية ومسجّلًا للاستجابات — وهي الـ fake القياسية للتبعيات المعتمدة على HTTP.
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(User{Name: "Alice"})
}))
defer ts.Close()متى تستخدم كل بديل
Stub: استجابة ثابتة بسيطة. Mock: التحقق من عدد الاستدعاءات ومعاملاتها. Fake: سلوك معقد. تجنب الإفراط في استخدام Mocks — فـ Fakes والمكونات الحقيقية في اختبارات التكامل أكثر موثوقية.
تجنب الاختبارات الهشة
تصبح Mocks التي تتحقق من ترتيب الاستدعاءات الدقيق أو قيم المعاملات هشة مع تطور التطبيق. فضّل Stubs مع التحقق من المخرجات أو Fakes متى أمكن.
اكتشاف الواجهات
استخرج الواجهات بعد تحديد السطح المستخدم من النوع الملموس من قِبل المستدعين (ISP). تدعم Go الإيفاء الضمني بالواجهات — ولا حاجة إلى تعديل النوع الملموس.
تحقق سريع
ما الفرق الأساسي بين stub وmock؟
خلاصة: بدائل الاختبار
النقاط الأساسية:
- صمّم اعتمادًا على الواجهات لإتاحة بدائل الاختبار
- Stub: يعيد بيانات محددة مسبقًا؛ Mock: يتحقق من التفاعلات
- استخدم httptest مع HTTP، وFakes داخل الذاكرة للتخزين
- تجنب الإفراط في استخدام Mocks — فضّل Fakes للسلوك المعقد
تعلم Go مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «بدائل الاختبار: Mocks وStubs» مجاني؟
نعم — نص درس «بدائل الاختبار: Mocks وStubs» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «بدائل الاختبار: Mocks وStubs»؟
الواجهات لتحسين قابلية الاختبار وحقن التبعيات تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «بدائل الاختبار: Mocks وStubs»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كتابة اختبارات الوحدات باستخدام testing
- الاختبارات المعتمدة على الجداول
- بدائل الاختبار: Mocks وStubs
- تغطية الاختبار وtestify