المحاكاة باستخدام GMock
حاكِ الاعتماديات
المحاكاة باستخدام GMock درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
لماذا نستخدم Mock؟
ينشئ GMock كائنات وهمية تسجّل الاستدعاءات وتعيد نتائج مبرمجة. وتفصل المحاكاة الوحدة قيد الاختبار عن التبعيات البطيئة أو غير المتوقعة، مثل قواعد البيانات أو الشبكات.
البدء بواجهة
تكون التبعيات القابلة للمحاكاة عادةً فئات أساسية مجردة تحتوي على دوال افتراضية.
#include <string>
class Database {
public:
virtual ~Database() = default;
virtual std::string get(int id) = 0;
virtual bool save(const std::string& v) = 0;
};تعريف فئة Mock
استخدموا MOCK_METHOD لإنشاء Mock لكل دالة افتراضية، مع تحديد نوع القيمة المرجعة والاسم والمعاملات والمؤهلات.
#include <gmock/gmock.h>
#include <string>
class Database {
public:
virtual ~Database() = default;
virtual std::string get(int id) = 0;
};
class MockDatabase : public Database {
public:
MOCK_METHOD(std::string, get, (int id), (override));
};ضبط التوقعات
يحدد EXPECT_CALL كيفية استدعاء دالة Mock وما الذي تعيده. وتبرمج WillOnce(Return(...)) النتيجة.
#include <gmock/gmock.h>
using ::testing::Return;
TEST(DbTest, ReturnsValue) {
MockDatabase db;
EXPECT_CALL(db, get(1)).WillOnce(Return("alice"));
EXPECT_EQ(db.get(1), "alice");
}مطابقات المعاملات
يمكن للتوقعات مطابقة المعاملات بمرونة باستخدام مطابقات مثل _ (أي قيمة)، أو Gt(5)، أو HasSubstr("x").
#include <gmock/gmock.h>
using ::testing::_;
using ::testing::Return;
TEST(DbTest, AnyId) {
MockDatabase db;
EXPECT_CALL(db, get(_)).WillRepeatedly(Return("x"));
EXPECT_EQ(db.get(99), "x");
}عدد مرات الاستدعاء
حدّد عدد المرات المتوقعة لاستدعاء ما باستخدام Times.
Times(1)مرة واحدة بالضبطTimes(AtLeast(2))Times(0)يجب ألّا يُستدعى مطلقًا
#include <gmock/gmock.h>
using ::testing::AtLeast;
using ::testing::Return;
TEST(DbTest, CalledTwice) {
MockDatabase db;
EXPECT_CALL(db, get(1)).Times(AtLeast(2)).WillRepeatedly(Return("v"));
db.get(1);
db.get(1);
}إجراءات الإرجاع
تحدّد الإجراءات السلوك.
Return(value)ReturnRef(ref)Throw(exception)Invoke(callable)لتشغيل شفرة مخصصة
حقن الكائن الوهمي
يجب أن تقبل الوحدة قيد الاختبار التبعية من خلال مؤشر أو مرجع إلى الواجهة. يُسمّى هذا حقن التبعية، وهو ما يجعل إنشاء الكائنات الوهمية ممكنًا.
#include <string>
class Database;
class UserService {
Database& db;
public:
UserService(Database& d) : db(d) {}
std::string name(int id);
};التحقق من التفاعلات
يتحقق GMock من جميع توقعات EXPECT_CALL عند إتلاف الكائن الوهمي. وتؤدي التوقعات غير المستوفاة، سواء بسبب عدد استدعاءات غير صحيح أو استدعاءات مفقودة، إلى فشل الاختبار تلقائيًا.
الكائنات الوهمية Nice وStrict وNaggy
تحكّم في طريقة التعامل مع الاستدعاءات غير المتوقعة.
NiceMock: تجاهل الاستدعاءات غير المهمةStrictMock: يؤدي أي استدعاء غير متوقع إلى فشل الاختبار- الافتراضي (naggy): يصدر تحذيرًا بشأن الاستدعاءات غير المهمة
حاكِ ما تملكه فقط
يُفضّل إنشاء كائنات وهمية لواجهاتك الخاصة بدلًا من الأصناف الملموسة التابعة لجهات خارجية. أنشئ واجهات تغليف رفيعة حول المكتبات الخارجية لتحافظ الاختبارات على استقرارها.
تحقق سريع
تذكّر متى يتحقق GMock من التوقعات.
مراجعة
لقد تعلّمتم GMock.
- حاكوا الواجهات الافتراضية باستخدام
MOCK_METHOD - تعمل
EXPECT_CALLمع الإجراءات لبرمجة السلوك - تتحكم المطابقات و
Timesفي المعاملات وعدد مرات الاستدعاء - احقنوا الكائنات الوهمية؛ ويُتحقق من التوقعات عند الإتلاف
الأسئلة الشائعة
هل درس «المحاكاة باستخدام GMock» مجاني؟
نعم — نص درس «المحاكاة باستخدام GMock» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «المحاكاة باستخدام GMock»؟
حاكِ الاعتماديات تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «المحاكاة باستخدام GMock»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إعداد GTest
- التأكيدات والمطابقات
- بيئات الاختبار والإعداد
- المحاكاة باستخدام GMock