mockery في Go: دليل شامل مع أمثلة عملية
1. ما هي مكتبة mockery ولماذا تحتاجها؟
Mockery هي أداة قوية لتوليد كائنات وهمية (mock objects) في لغة Go. في التطوير الحديث بلغة Go، حيث تلعب الواجهات (interfaces) دورًا محوريًا، يتطلب اختبار المكونات المنعزلة غالبًا إنشاء بدائل للتبعيات الخارجية. تعمل Mockery على أتمتة هذه العملية، حيث تولد تطبيقات كاملة للواجهات يمكن استخدامها في اختبارات الوحدة (unit tests). بدلاً من كتابة عشرات الأسطر من الكود يدويًا لكل واجهة، يمكنك ببساطة تشغيل أمر واحد والحصول على mock جاهز بجميع الطرق اللازمة.
المهمة الأساسية لـ mockery هي تبسيط اختبار الكود الذي يعتمد على خدمات خارجية (قواعد بيانات، واجهات برمجة تطبيقات، أنظمة ملفات، إلخ). تتيح لك الـ mocks المُنشأة التحكم في القيم المُعادة، والتحقق من عدد مرات استدعاء الطرق والوسائط التي تم استدعاؤها بها. هذا مفيد بشكل خاص عند تطوير الخدمات المصغرة (microservices)، حيث يجب اختبار كل مكون بشكل منعزل. تستخدم المكتبة حزمة testify/mock الشهيرة كأساس، مما يضمن التوافق مع معظم مشاريع Go.
تدعم Mockery الواجهات البسيطة ذات الطرق القليلة والهياكل الهرمية المعقدة. يمكنها توليد mocks للأنواع المضمنة، والواجهات من الحزم الخارجية، وحتى الواجهات العامة (generic) (بدءًا من Go 1.18). بفضل نظام التكوين المرن، يمكنك التحكم في أسماء الملفات، والحزم التي توضع فيها الـ mocks، وحتى إضافة طرق مخصصة. هذا يجعل mockery أداة لا غنى عنها في ترسانة أي مطور Go يسعى إلى كود عالي الجودة وقابل للصيانة.
2. التثبيت
يتم تثبيت mockery عبر مدير الحزم القياسي في Go. قم بتنفيذ الأمر التالي:
go install github.com/vektra/mockery/v2@latest
بعد التثبيت، تأكد من وجود الملف الثنائي في مسار $PATH الخاص بك. عادةً ما يتم تثبيته في $GOPATH/bin أو $HOME/go/bin. يمكنك التحقق من التثبيت باستخدام الأمر:
mockery --version
إذا كنت تستخدم وحدات Go (Go modules)، يُوصى بإضافة mockery كأداة تطوير. للقيام بذلك، قم بإنشاء أو تعديل ملف tools.go في جذر المشروع:
//go:build tools
// +build tools
package tools
import (
_ "github.com/vektra/mockery/v2"
)
ثم قم بتنفيذ:
go mod tidy
يضمن هذا تثبيت إصدار mockery في ملف go.mod الخاص بك.
3. البداية السريعة — مثال عملي بسيط
لنلقِ نظرة على مثال بسيط. لنفترض أن لدينا واجهة UserRepository:
// user.go
package main
type User struct {
ID int
Name string
}
type UserRepository interface {
GetUser(id int) (*User, error)
SaveUser(user *User) error
}
لتوليد mock، قم بتنفيذ الأمر التالي في جذر المشروع:
mockery --name=UserRepository --output=mocks --with-expecter
سينشئ هذا الأمر ملف mocks/UserRepository.go مع تطبيق mock. الآن يمكننا استخدامه في اختبار:
// user_test.go
package main
import (
"testing"
"github.com/stretchr/testify/assert"
"your-project/mocks"
)
func TestGetUser(t *testing.T) {
// إنشاء mock
mockRepo := mocks.NewUserRepository(t)
// إعداد السلوك المتوقع
expectedUser := &User{ID: 1, Name: "أحمد"}
mockRepo.On("GetUser", 1).Return(expectedUser, nil)
// استدعاء الدالة المختبرة
user, err := mockRepo.GetUser(1)
// التحقق من النتائج
assert.NoError(t, err)
assert.Equal(t, expectedUser, user)
// التحقق من أن جميع التوقعات قد تحققت
mockRepo.AssertExpectations(t)
}