שתי גישות לבדיקת קוד מתוזמן ב Rails
בשביל לזהות טקסט AI בקטע ספרותי משתמשים במקפים המיוחדים שלהם שרק AI אוהב לכתוב. בשביל לזהות קוד שיוצר על ידי AI אנחנו נרצה לשים לב לשימוש יתר בתבניות וערבוב עדין בין תבניות. זה נראה יפה במבט ראשון אבל משהו קטן צורם שם. הדוגמה של היום היא בדיקה בתוכנית ריילס:
context 'when multi-part SMS - first chunk' do
it 'stores in Redis and schedules delayed job' do
allow(Vonage::InboundSmsService).to receive(:new).and_return(double(create_message: nil))
allow(described_class).to receive(:set).and_return(described_class)
allow(described_class).to receive(:perform_later)
freeze_time
described_class.handle_concatenated_chunk(params)
expect(described_class).to have_received(:set).with(wait: 2.minutes)
end
end
הקוד מטפל בסמסים שמגיעים בחלקים כי ההודעה ארוכה ורוצה לבדוק שאחרי החלק הראשון שמנו משימה ל-2 דקות קדימה שתאסוף את החלקים. החשיבות של משימה כזו היא לצורך טיפול בהודעה חלקית, כלומר אם כל החלקים הגיעו אז החלק האחרון יאסוף את כולם ויחבר אותם להודעה אחת. אבל אם רק חלק מהחלקים הגיעו אנחנו צריכים לזהות שעבר מספיק זמן מהחלק הראשון, להניח שההמשך כבר לא יגיע ולחבר את מה שיש. פה מוגדר פרק זמן של 2 דקות המתנה אבל אפשר לשחק עם זה. בכל מקרה מה שחשוב לסיפור שלנו הוא לא הקוד האמיתי אלא הבדיקה.
הבדיקה מנסה לוודא שאחרי הפעלת הפונקציה handle_concatenated_chunk נשלחת הודעה מתוזמנת לשתי דקות קדימה כדי לטפל בהודעות החלקיות. אבל היא עושה את זה באמצעות ערבוב של שתי תבניות:
דרך אחת לזהות שמשימה מתוזמנת נשלחה היא להסתכל על הקריאות לפונקציות של המשימה - אנחנו מצפים שהפונקציה set תקרא עם פרמטר של שתי דקות המתנה ובשביל זה אנחנו דורסים חלק מהפונקציות ומוודאים הפעלה.
דרך שניה לזהות שמשימה מתוזמנת נשלחה היא לא לדרוס מימושים אלא להסתכל בתור המשימות המתוזמנות ולראות שיש שם משימה מתוזמנת לשתי דקות קדימה. מי שירצה לעשות את זה יגלה שיש פער זמן קטן בין המשימה המתוזמנת בתור לבין "שתי דקות קדימה" מרגע הבדיקה, כי עברו כמה מילי שניות מהרגע שיצרנו את המשימה המתוזמנת לרגע בו בדקנו אותה. בשביל זה אנחנו נוהגים להקפיא את הזמן לפני הקריאה לפונקציה.
כלומר בגישה הראשונה נכתוב את הבדיקה הזו:
context 'when multi-part SMS - first chunk' do
it 'stores in Redis and schedules delayed job' do
allow(Vonage::InboundSmsService).to receive(:new).and_return(double(create_message: nil))
allow(described_class).to receive(:set).and_return(described_class)
allow(described_class).to receive(:perform_later)
described_class.handle_concatenated_chunk(params)
expect(described_class).to have_received(:set).with(wait: 2.minutes)
end
end
ובגישה השנייה נכתוב את הבדיקה הזו:
context 'when multi-part SMS - first chunk' do
it 'stores in Redis and schedules delayed job' do
freeze_time
expect do
described_class.handle_concatenated_chunk(params)
end.to have_enqueued_job(described_class).at(2.minutes.from_now)
end
end
והגישה המעורבבת? רק עוד סימן לקוד שנכתב בלי השגחה.