On 5 Sep, 2005, at 20:54, Shlomi Fish wrote:


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

כך, שלדעתי, הדרך שאני הצעתי (ושעמית אחר-כך שיפר במקצת) של התלבשות על
sys.modules היא הדרך ה-failsafe וה-foolproof ביותר.

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

החלפת המודול ב sys.modules היא רעיון טוב, אבל יתכן שמודולים אחרים כבר "קשרו" לעצמם שמות מתוך המודול הישן, ולא ישתמש במודול החדש. למשל:

>>> import cgi
>>> from cgi import parse_qs
>>> def mock_parse_qs():
...     print "I'm a mockup"
...
>>> cgi.parse_qs = mock_parse_qs
>>> parse_qs is cgi.parse_qs
False

כך שהחלפת המודול עלולה להיות מאוחרת מידי.


ניר סופר

ִ

לענות