טסטים ללא API KEY

אוקיי.
בוא נקרא לפונקציה שקוראת ישירות ל־db_cleanup, אבל לא לשום פונקציה אחרת מהקוד שלך, בשם “היחידה הבסיסית ממעלה 2”.
אני מבקש ממך להצביע על אותה יחידה בסיסית ממעלה 2 בשם שלה (נניח authenticate_user_from_form, סתם זורק), להגיד לי באיזה קובץ ושורה בקישור שנתת היא מופיעה (נניח: בקובץ users.py בשורה 50), ולהסביר לי איפה התקשית לבנות עבורה טסט (נניח: אני לא בטוח איך לעשות Mock לפונקציה google.Authenticate כיוון שהיא אמורה לדבר עם השרתים של גוגל) :slight_smile:

היחידה הבסיסית ממעלה 2 היא: get_current_year_events בשורה 76.

אין לי איך לבנות לה mock, מכיוון שהיא אמורה לדבר עם השרתים של גוגל בקצרה.

לייק 1

יפה. הפונקציה שאתה מדבר עליה, שמדברת עם השרתים של גוגל בפונקציה שציינת, היא build שנמצאת במודול googleapiclient.discovery.

חיפשתי בגוגל pytest mock googleapiclient.discovery build, ומצאתי הרבה דוגמאות עובדות.
האם יצא לך לראות את הדוגמאות הללו?

כן יצא לי לראות ולנסות ואני נתקל באותה בעיה…

כי build מכין service שממנו אני שולח בקשה לקבל את האירועים.

האם עבור הפונקציה get_current_year_events הצלחת לבנות mock?

אם לא – מה מנע בעדך, בהינתן הדוגמאות העובדות בקישור ששלחתי?
אם כן – מצא לי את הפונקציה שקוראת ישירות ל־get_current_year_events ועבורה אתה לא מצליח לבנות mock.

לא הצלחתי לבנות mock ל get_current_year_events.

כי בשביל להשתמש בbuild עם calendar api צריך להעביר credentials שהם valid, הצלחתי לבנות mock של בcredentials, אבל אם אני מעביר אותם לbuild זה נכשל, וגם אי אפשר לעשות בקשה לAPI.

אני פשוט צריך דוגמא טובה ואין אפילו דוקומנטציה של mock עם google calendar api.

לייק 1

לעיתים קרובות אין תיעוד לאיך עושים Mock, וזה משהו שצריך לחבר בעצמך לפי היגיון וקצת משחק עם החלקים הזזים.
במקרה הנוכחי זה אכן קצת מורכב לעשות את זה לבד, אבל דווקא כן מצאתי תיעוד של איך לבנות Mock למודולים ששם. יצא לך לראות את התיעוד הזה?

כן יצא לי לראות את זה.

גם פה זה על האותו עקרון שכתבתי.

בתיעוד ששלחת הם לא צריכים להשתמש ב credentials, עם הservice שהם בחרו…
אני חייב.

ה־developerKey שם די זהה ל־credentials, זה פרקטית אותו דבר.
האם ניסית לעשות בדיוק אותו דבר עם הסרביס שלך, רק כן להשתמש ב־credentials במקום developerKey?

אני מבין את הטענה שיש יותר מבקשה אחת שאתה שולח, והן מתבצעות טורית, אחת אחרי השנייה, והשנייה מתבססת על תוצאות הראשונה – ולכן פחות אינטואיטיבי לך שיהיה Mock עבור הראשון.
הם מתייחסים לזה בתיעוד.

ניסיתי זה לא הצליח לי, וניסיתי עוד פעם עכשיו ולא הצליח

מה ניסית? איפה זה כשל?
עם קוד בבקשה

לייק 1

שאתה יוצר build הוא שולח את הcredentials לגוגל גם עם pytest, ולי אין credentials שהם valid לספק לו.
ניסיתי לשלוח גם בלי credentials כי כקראתי שזה אפשרי, וזה גם כשל.

לא עובר את build בשורה 11.

אפשר בבקשה כטקסט כדי שאוכל להעתיק ולהדביק אצלי?

לייק 1
from datetime import datetime
from google.oauth2.credentials import Credentials

from googleapiclient.discovery import build
from googleapiclient.http import HttpMockSequence

def test_google_connect():
    http = HttpMockSequence([({'status': '200'}, "{}")])
    cred = Credentials()
    service = build('calendar', 'v3', credentials=cred)
    request = service.volumes().list(calendarId='primary',
                                     timeMin=datetime(2021,1,1).isoformat(),
                                     timeMax=datetime(2022, 1, 1).isoformat(),
                                     singleEvents=True,
                                     orderBy='startTime'
                                     ).execute()
לייק 1

אוקיי.
מה המטרה של ה־Mock שאנחנו מנסים לכתוב פה בעצם?
אם נצליח לכתוב Mock כזה, מה נשיג? מה זה יאפשר לנו?

זה יאפשר לנו לכתוב בדיקה ליחידה הבסיסית ממעלה 2 get_current_year_events

למה אנחנו לא יכולים בלי ה־Mock? למה ה־Mock יעזור לנו?

זה לא הרעיון? לבדוק את הקוד.

בגדול הmock לא עוזר לכלום כשחושבים על זה לעומק רק מדמה את החיבור לשרת…

בוא ניקח צעד אחורה.
הסכמנו שאנחנו לא מצליחים לבנות טסט על get_current_year_events, וזה לא טוב.
מה חסר לך כדי שכן תוכל לבנות עבורו טסט?

לייק 1