Mocks وSpies
اعزل الشيفرة قيد الاختبار
Mocks وSpies درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
بدائل الاختبار
تعتمد الدالة أحيانًا على شيء بطيء أو خارجي، مثل استدعاء شبكي أو أداة تسجيل. تستبدل بدائل الاختبار هذه الاعتماديات ببدائل يمكن التحكم بها.
يوفر busted ثلاثة أنواع: spies وstubs وmocks. ولكل منها استخدام مختلف.
ما يفعله spy
يغلّف spy دالةً ويسجل كيفية استدعائها، مع الاستمرار في تشغيل الدالة الأصلية. ويتيح لك التحقق من استدعاء شيء ما.
أنشئه باستخدام spy.new حول دالة، أو استخدم spy لمراقبة حقل في جدول.
local s = spy.new(function() end)
s(1, 2)
assert.spy(s).was.called()مراقبة دالة
استخدم spy.on لمراقبة دالة في جدول موجود. تستمر الدالة الأصلية في التنفيذ، لكن busted يتتبع كل استدعاء.
يفيد ذلك خصوصًا في التأكد من حدوث تأثير جانبي، مثل استدعاء أداة تسجيل.
spy.on(logger, "info")
service.run()
assert.spy(logger.info).was.called()التحقق من عدد الاستدعاءات
يسجل spy عدد مرات استدعائه. استخدم was.called(n) للتأكد من عدد محدد تمامًا.
يكشف ذلك الأخطاء التي تُستدعى فيها دالة مرات كثيرة جدًا أو لا تُستدعى مطلقًا.
assert.spy(s).was.called(2)
assert.spy(s).was_not.called()التحقق من وسائط الاستدعاء
يمكنك التحقق من الوسائط التي تلقاها spy باستخدام was.called_with. يقارن busted الوسائط المسجلة بالتوقع الذي تحدده.
وهذا يتحقق ليس فقط من تشغيل الدالة، بل من تشغيلها بالطريقة الصحيحة أيضًا.
local s = spy.new(function() end)
s("user", 42)
assert.spy(s).was.called_with("user", 42)ما يفعله stub
يستبدل stub الدالة بالكامل، لذا لا تُنفَّذ الدالة الأصلية مطلقًا. استخدمه لتجاوز العمل البطيء أو غير المرغوب فيه، مثل الوصول الفعلي إلى الشبكة أو القرص.
أنشئه باستخدام stub على حقل في جدول. وبشكل افتراضي، لا يفعل stub شيئًا ويعيد nil.
stub(api, "fetch")
service.load()
assert.stub(api.fetch).was.called()القيم التي يعيدها stub
يمكنك جعل stub يعيد قيمة ثابتة باستخدام returns. وبهذا تمرر بيانات مضبوطة إلى الشيفرة قيد الاختبار.
وبذلك لا يعتمد اختبارك إطلاقًا على الاعتمادية الحقيقية.
stub(api, "fetch").returns({id = 1})
local r = service.load()
assert.are.same({id = 1}, r)ما يفعله mock
يأخذ mock جدولًا موجودًا ويحوّل جميع دواله إلى spies أو stubs دفعة واحدة. وهذه طريقة مريحة لتتبع كائن بأكمله.
استدعِ mock(obj) لتغليفه، ثم أجرِ التأكيدات على الدوال الفردية.
local m = mock(realLogger)
app.start(m)
assert.spy(m.warn).was.called()mock مع دوال مستبدلة بـ stub
يؤدي تمرير true باعتبارها الوسيط الثاني إلى mock إلى استبدال كل دالة بـ stub، فلا تُنفَّذ أي من الدوال الأصلية. وبذلك تعزل الكائن بالكامل.
استخدم هذا الأسلوب عندما تكون للدوال الحقيقية تأثيرات جانبية يجب تجنبها.
local db = mock(database, true)
db.query.returns({})
assert.are.same({}, repo.all())استعادة بدائل الاختبار
تُعدِّل spies وstubs وmocks الجداول المشتركة، لذا يجب استعادتها، وإلا فسترى الاختبارات اللاحقة البديل الاختباري. استدعِ :revert() أو mock.revert.
ضع الاستعادة داخل after_each لضمان حالة نظيفة بين الاختبارات.
after_each(function()
mock.revert(m)
end)اختيار البديل المناسب
استخدم spy لمراقبة دالة حقيقية، وstub لاستبدالها بسلوك مضبوط، وmock لتغليف كائن بأكمله دفعة واحدة.
فضّل أخف بديل يحقق الغرض. فالإفراط في استخدام mocks قد يجعل الاختبارات هشة ويخفي الأخطاء الحقيقية.
describe("mailer", function()
it("sends once", function()
local s = spy.on(smtp, "send")
mailer.notify("a@b.com")
assert.spy(s).was.called(1)
end)
end)اختبار سريع
اختبر فهمك لبدائل الاختبار في busted.
مراجعة
تعزل بدائل الاختبار الشيفرة عن الاعتماديات البطيئة أو الخارجية. يسجل spy الاستدعاءات مع تشغيل الدالة الأصلية، ويستبدل stub الدالة بسلوك مضبوط، بينما يغلّف mock كائنًا بأكمله.
أجرِ التأكيدات باستخدام was.called وwas.called_with، واستعد بدائل الاختبار دائمًا باستخدام revert داخل after_each للحفاظ على عزل الاختبارات.
الأسئلة الشائعة
هل درس «Mocks وSpies» مجاني؟
نعم — نص درس «Mocks وSpies» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «Mocks وSpies»؟
اعزل الشيفرة قيد الاختبار تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «Mocks وSpies»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا نختبر
- كتل describe وit
- التوكيدات
- Mocks وSpies