Lesson 9 of 22
Isolation Frameworks
In this lesson
Roy Osherove explains that isolation frameworks (external link, opens in new tab) generate fakes (external link, opens in new tab) in memory that return values, throw exceptions and verify calls, and that any fake is a mock (external link, opens in new tab) if the test verifies against it and a stub (external link, opens in new tab) otherwise. He splits .NET frameworks into constrained ones (external link, opens in new tab) such as Rhino Mocks (external link, opens in new tab), Moq (external link, opens in new tab), FakeItEasy (external link, opens in new tab) and NSubstitute, which can only fake virtual or interface methods, and profiler-based ones (external link, opens in new tab) such as Typemock Isolator (external link, opens in new tab), JustMock (external link, opens in new tab) and Moles, which can also fake static methods. He then rewrites the logger tests with NUnit (external link, opens in new tab)'s basic dynamic mocks, Rhino Mocks and Moq, comparing string method names with lambda expressions, strict and non-strict mocks.
Transcript
[00:07] (external link, opens in new tab) צריך להגיד פעמים יש ספר שנקרא XIT test מישהו קרא אותו מסתכל עליו ראה את השם כבר XIT test בספר הזה כשמתארים סוגים של fake (external link, opens in new tab) objects יש את כל הסוגים האלה לכל אחד מהם יש בעצם זה צורת מימוש אחרת יכול להיות אצל לכם סוגים של סטיק אופט שיש להם כבר מימוש מלא אבל מאוד פשוט יחסית למערכה האמיתית אה מבחינתנו מבחינת הצורה שבה אני חושב על זה יש אך ורק שלושה סוגים של פיקט יש כל דבר שהוא פייק (external link, opens in new tab) זה בעצם משהו שנראה כמו משהו אחר ובהתאם לשימוש פה שזה או מוק (external link, opens in new tab) אוסב
[00:41] (external link, opens in new tab) אז אם אתה עושה או verifיפי אז זה מוק object אחרת זהסט זאת הדרך הכי פשוטה לחשוב על זה אחרי זה כשכבר יהיה לכם יותר נוח עם כל הטרמינולוגיה אז תוכלו כבר להיפטר עם זה יש לי פה איזה סקייפ שרץ אוקיי
[01:14] (external link, opens in new tab) אוקיי אבל יש גם הנושא של מה שעשינו עד עכשיו יש איתו הרבה בעיות >> יש איתו הרבה בעיות עם הדבר הזה. זאת אומרת, ברגע שיש לנו API שיותר משתיים שלוש פונקציות, זה כבר נהיה קצת מבאס לממש את הדבר הזה. למרות שאני מניח שחובכם כבר שמתי להם שזה די פשוט מה שעשינו עכשיו. ו גם כמות הפרמטרים, אם יש לנו פרמטר אחד מאלה אפשר לשמור.
[01:46] (external link, opens in new tab) אבל מה קורה כשאני רוצה להתחיל לבדוק דברים כמו מה קרה בקריאה השנייה או האם מתוך 100 קריאות אחת מהם הכילה את הפרמטר המסוים הזה? אז אם הייתם ממשיכים עם הגישה הזאת שנתיים שלוש הייתם מגיעים הייתם מייצרים בעצם אינפסטקצר משלכם שמאפשר לבדוק את כל הדברים האלה בעצמכם וזה בדיוק מה שהisolation frameworks עושים היום זה infrastructure או moring frameworks זה אינפסר שבעצם כבר לקח את כל הדבר הזה צעד אחד קדימה ואמר אני אתן לך משהו שמאפשר לך ליצור קלאס אבל בזיכרון זאת אומרת אני אגנרate אייצר קוד בזיכרון
[02:21] (external link, opens in new tab) והקוד הזה כבר יעשה אוברייד לכל הפונקציות וכבר ישמור את כל המידע מידה ואז תוכל לעשות verifיפי אוט שמשהו יתקבר או תוכל להגיד לי לזרוק אספtion זה בסך הכל קוד שהוא לא מסובך לכתיבה הבעיה האמיתית היא ליצור את זה בזיכרון ופה באמת הנושא של פריימורקינג נכנס בצורה מאוד חזקה ברגע שיש לנו API שקצת קשה לעשות פייק בצורה ידנית אז פריורקים כמורינוקס מוק ועוד כמה שאנחנו נראה פותרים את הבעיה בצורה מאוד יפה בעצם בשורה אחת של קוד הם מאפשרים לנו
[02:57] (external link, opens in new tab) ליצור קלאס בזיכרון, ליצור את הקוד שיוצ שיברש מאינטרפייס בזיכרון או מקס אמיתי לממש את כל הפונקציות הוירטואליות או הפאבליק ואינטרפי ווגם לתת את כל הפונקציונליות הזאת של תבדוק שמשהו נקרא או תגרום למשהו להתנהג בצורה אחרת כמו לזרוק אפtion או להחזיר איזשהו value אז גם סימולציה של return values והתנהגות וגם וידוי שמה שהוא נקרא עכשיו הסיבה שאני קורא להם framewor זה בגלל שלמילה מ כמו שהבנתם יש חשיבות מוק זה משהו שעוזר לי לוודא שהטest עבר או לא ברוב הזמן בטestטים שלי אין לי כמעט מוצק ברוב הזמן יש לי stubים שאנשים אומרים I want to mo this out הם בעצם בדרך כלל מתכוונים לזה שהם רוצים לעשות stubb למשהו לכן אני פשוט משתמש במילה פיק ואני גומר עניין תעשה פייק לזה תעשה פייק לזה אחרי זה תעשה וריפי שזה נקרא
[03:51] (external link, opens in new tab) אבל כשאנשים אומרים obקט בדרך כלל מה שהם מתכוונים סטב עכשיו עוד פעם הסיבה שזה חשוב למה הטרמינולוגיה הזאת חשובה זה בגלל שאתם מסתכלים על טestטים של מישהו אחר חייבים להבין שיש מobק ויש stבס ומק object לא צריך להיות יותר מאחד מהם stבס שיהיו לכם גם 50 בטest זה קצת זה אומר על איזשהו דיזיין זאת אומרת שיש לכם 50 סטאבים (external link, opens in new tab) אבל אתם יכולים בגלל הנושא של הוריפיקציה עכשיו כשמד מדברים על isolation frameworks (external link, opens in new tab) isolation בעצם אומר שאתה לוקח משהו ואתה אתה עושה לו isolate מהסביבה
[04:25] (external link, opens in new tab) שמסביב לו, כל הדdeפendנenes שלו, כל הדברים שאין לך שליטה עליהם בדוnet ובכלל יש שני סוגים של וואו isolation framework יש isolation frameworks שמה שנקרא אני קורא להם constraint וuncrain constrain זה בעצם frameworים שמייצרים קוד בזיכרון כמו שאתם יצרתם עכשיו קוד בקפיילר יוצרים ממש מייצרים קוד בil במקרה הזה אבל זה עדיין קוד שיורש מקלס מסוים, מממש את הפונקציות שלו ואת כל המידע ועושה קבקים על כל פעם שמשהו נקרא.
[05:02] (external link, opens in new tab) והפרamרוקים האלה זה בדרך כלל הפרוקים שהם קונסטר בד.net אני קורא להם prוקoxy בגלל שהפריורקים האלה שאתם רואים מצד ימין הם כולם משתמשים באותו אינפסרקר כדי לעשות את העבודה שלהם. יש DL שנקרא. אטפ C2 למי שמכיר ומה שהוא מייצר בעצם זה מאפשר לך בזיכרון ליצור פרוקסי של כל אובייקט אבל מה זה כל אובייקט רק אובייקטים שאפשר לרשת מהם אם יש לך קלאס שהואסילד אתה לא יכול לייצר קוד שיורש ממנו זה לא יתקמפה לך אז גם מפרים אוקים האלה לא יכולים לרשת מקס שהוא סיל אתה רוצה להחליף פונקציה שהיא לא וירטואלית והיא לא מאינטרפייס אתה לא תוכל לעשות את זה כמו שאתם לא תוכלו לעשות את זה כשכתבתם עכשיו את הקלאס שלכם של פייק לogגר אז אם לפי אם ללוגר יש פונקציה סטטית אי אפשר לעשות לה
[05:49] (external link, opens in new tab) וגם מוקים האלה לא יודעות לעשות להם או כי כל הפרוקסי כל הקסל אקטיב prוקסי על הדרך שבה עובד זה הוא מייצר קוד כמו שאתם מייצרים אותו רק בזיכרון מקמפל אותו בזיכרון ונותן לכם את הקולב בקן את היכולת לבדוק שמשהו נשמר עכשיו כל הפרים אלי הם גם open source והם חינמים אמ אני כבר לא מאמין להשתמש ברינו אוקס למרות שפעם המלצתי אפילו כאילו כתבתי את הספר שלי עם דוגמאות מרנוקס אבל בגרסה הבאה של הספר אני כבר לא משתמש בו
[06:22] (external link, opens in new tab) אני תכף אסביר nunitס זה framewורק שמגיע יחד עם NUnit (external link, opens in new tab) והוא פרwורק מאוד מאוד בסיסי שמאפשר לנו שבעצם באמצעותו באמצעותו יונית בודק את עצמו בהתחלה כשיוט נבדק אז הוא כתב לעצמו isolation framework משלו אבל הוא מאוד מאוד בסיסי ואין לו המון המון מהפיצ'רים שאנחנו שיש להם בפרימוקים החדשים יותר מוקספ מוק שתכף אנחנו נסתכל עליו חייבים ללמוד אותו בגלל שהוא מרבית את האוכלוסיה שלדות נט משתמשת במוק
[06:53] (external link, opens in new tab) החצי השני של האוכלוסייה משתמש ברינוקס אנחנו גם נראה דוגמה של רובקס אבל אני לא מועס להשתמש בו הסיבה שהוא כבר פרימוק שהוא ישן מאוד הוא כמעט ולא מתוחזק על ידי היוצר שלו ויש לו שלושה סוגי API והי שלו גם החדש ביותר הוא פחות נוח מאשר הפרימוקים האחרים שני פרוקים חדשים שאני מסתכל עלים זה FakeItEasy (external link, opens in new tab) ו-NSubstitute שזה שני פרורקים שאני ממליץ להשתמש בהם היום כשמדברים על פרמורקים שהם קסטרrain והם חינמים
[07:24] (external link, opens in new tab) לשניהם יש API מאוד שונים אבל עוד פעם יש להם את אותם יכולות בסיסיות שיש לכל האחרים אז ההבדל היחיד הדבר היחיד שמאחד ביניהם זה הAPI יש להם אותו סט של קונסטרנטים או אותו סט של יכולות בעצם מצד שני יש את הCSTR frameworks בג'אבה יש frameworים שיכולים לעשות fake לstatic methods וגם בד יש כאן frameworים ב.net נותנה את הCor זה בגלל שהם משתמשים בדבר שנקרא פרופיל API וגה זה כי הם משנים את הביטקד של הג'אבה בזמן גם בזמן קומפילציה או גם ברun
[08:00] (external link, opens in new tab) אז הCstra frameworks בוnet אני קורא להם based כל הפרקים שאתם רואים פה הם profי base הם לא open source המס הוא חינם אבל הוא עולה הרבה מאוד כסף מבחינת תחזוקה אז אני לא ממליץ להשתמש בו אגנו nock ונוק שניהם עולים עם הרבה כסף ג'סמו עולה בערך חצי מה שטימו עולה אבל גם מבחינת הפיצ'רים שהוא חוסף זה בערך חצי מהפיצ'רים למרות שכל יום הוא משתפר אז יגיע היום ויהיה הרבה יותר שווה להשתמש בטסמו מאשר בטייטמו עכשיו אני עבדתי שלוש שנים בחברת טיפורק עד לפני שנתיים עבדתי שם הייתי שם CTO ועזרתי לתכנן חלק מהipi אז כשאנחנו ניכנס ללגס קוד וגם היום אני אראה לכם חלק מהipיים שלנו קסator
[08:43] (external link, opens in new tab) אבל מה שחשוב להבין זה שזה בסך הכל עוד פרופילר בספר frameworks היכולות שלו הם אחרות לגמרי מהיכולות שיש בפוקסי אבל היכולות של כל אלה הם בעצם אותו סט של יכולות שיש בפרופיילר אז כדי להבין איזה יכולות יש צריך להבין את הפרופי API מי למי יצא לעבוד עם פרופיילר API אוקיי רוב האנשים בדרך כלל לא מכירים את הפרופיילר API בגלל שרוב אנשים לא צריכים להיר אני אסביר קצת על הדבר הזה אה כשאנחנו מריציםקוד של אז בגדול הקוד של net הוא hosted
[09:19] (external link, opens in new tab) בoccess והוא hosted כסוג של com object אחד גדול והcobect הזה ההost שלו הוא כתוב ב+ בmanage c++ וההוסט שלו נותן סדרה שלטים על כל דבר שקורה במהלך ההוסטינג סוג סוג הדברים שקורים זה הרצה של פונקציה דוגמה בהתחלה של פונקציה בסוף פונקציה עוד דברים שקורים לדוגמה זה שכשאנחנו קוזים קוד אנחנו לא באמת מקמפלים הרי לבנר אנחנו מקמפלים IL ברוב המקרה הCLR הקon language run time כשהוא מעלה את הקוד שלנו הוא מקמפל את ה שלנו לbינaryקוד בזיכרון
[09:56] (external link, opens in new tab) זאת אומרת יש טרנספורמציה שקוראת מil לbיaryקוד בתוך ההוסטנ וגם לזה יש לנו event זאת אומרת יש לנו את היכולת להתחבר להוקים האלה אך ורק בmaned cod c++ לדוגמהent כמו before module load ובאent הזה אני יכול לקבל את IL של אסמלי כל אסמלי לא רק בכך שלי לפני שהוא מקומפל ל לב לנy cod ויש לי גם את היכולת לשנות את ה בסיכרון
[10:28] (external link, opens in new tab) אוקיי עכשיו בil אין את אותם קונסטרנטים שיש בשפה כמו C# יש הרבה פחות קונסטרנטים ואני יכול לשנות מה שאני רוצה כל זמן שזה חוקי זאת אומרת אני יכול לשנות את הב את ה של כל פונקציה גם אם פונקציה סטטית אז בגדול מה שרוב הפרימוקים שהם פרופיילר ביסט עושים הם כותבים גוקים לunmanage profיילר api עוברים על i של כל הדברים שנס שמועלים בזיכרון דרך אגב זה עובר על הכל SharePoint גם עובר את התהליך הזה זאת אומרת גם קוד שלא אתם כתבתם עובר את התהליך הזה ויש לכם טבוקים ואתם יכולים לשנות קוד שאתם לא כתבתם בעצמכם והוא לא נמצא בחברה שלכם בכלל
[11:13] (external link, opens in new tab) ומה שהם עושים בגדול הם מוסיפים לתחיל מילה וסוף של כל פונקציה כל פונקציה בחבי כל הCLR את היכולת לבדוק אם אם כדאי לשנות את את הurn value או את הבי של הפונקציה תחשבו על זה שזה סוג של aspect oriented prraming ברמת כל הפונקציות בCLR אז אני יכול עכשיו לקחת איזשהו פונקציה שהיא private או statטיקrור איפהשהו ואני יכול להגיד שהסatטy conונסטרקטור של הקס של הביס הזה בלגסוד נקרא אז אני רוצה שתזרוק את האקס המסוים הזה out of memory
[11:46] (external link, opens in new tab) הסatic conסctטור הוא ilגם עובר קומפילציה בCLR ונוסף לו הזה בהתחלה ובסוף ואז ברט time יש את הבדיקה הזאת בהתחלה האם כדאי לי להחזיר fake value או להחזיר exception ובאפtion האלה אנחנו שולטים נשקות שכתבנו בשר מה שמאפשר לי בעצם לשנות את ההתנהגות של כל פונקציה במערכת כולל בין השער פונקציות של של הדסר בעצמו של הדפר אני יכול לשנות את ההתנהגות של day now שתמיד יחזיר את אותו זמן לדוגמה בלי לעשות שום דבר אחר וזה סוג הכוח שיש לנו בדברים האלה אז בפרופיילר ביס פרימוקס
[12:27] (external link, opens in new tab) א' זה נורא מסובך על הדבר הזה ואין לו שום דוקומנטציה טובה מה שאומר שזה המון מאמץ לכתוב פריורק הזה עכשיו היכולות הם כמעט בלתי מוגבלות לכן ההבדל בין הפריורקים האלה זה כמות היכולות שהם חוספים לא רק הז אם בפרורק אללה כולם עושים בערך את אותם יכולות אלה עושים סט שונה של יכולות כל אחת בגלל שזה לוקח סמן לחשוב על יכולות שכדאי לממש אני אתן לכם דוגמה בטמוק אסולטור אפשר להחליף
[13:00] (external link, opens in new tab) התנהגות של כל פונקציה prיטפליק b רק מעט מאוד מהפונקציות בדוט framework עצמו ברמת הCLRl אני לא זוכר את השם שלו כרגע MSI >> MSI רק במsליפ DL יש שם מעט מאוד פונקציות שטימו מחליף אבל הסיבה הייתה זאת אומרת יכולנו בגדול להחליט שכל הסטרינגים במערכת מאותו רגע מחזירים את האות A יכולנו אבל תחשבו שלכל סטרינג במערכת יש קולבק לבדוק מה כדאי לו להחזיר מה שאומר שהפרפורמנס נהיה מטורף מבחינת אז כל הטestטים הרבה יותר איתיים אז כסוג של בחירה בגיוון שזה נורא מסובך ואם אתה לא עובד בתוך מי מייקרוסופט נורא קשה לעשות את זה אז הייתה בחירה לעשות כמה שפחות מהטייפים האלה אז בגדול משנה כמה מהדברים שלפיילioioo
[13:52] (external link, opens in new tab) שלסטםפיל ושלט time אבל בגדול כל פיwורק אחר כל דלילל אחר אתם יכולים להחליף כל התנהגות הוא סוג של היתק לtייפo ליתר דיוק חברת טלריק היא לקוח של טייפו הייתה לקוח של טייפו עד שהם החליטו לייצר טקט מדויק זאת אומרת ברמת מת הDL איך הסתכלנו על הדברים האלה זה היה מאוד מאוד מעניין להסתכל ולהגיד אוקיי זה סוג של מחמא אבל זה גם היה די מעצבן והם יצאו עם משהו שגם דומה בI ויש להם את אותם יכולות מבחינת האנדרליין
[14:27] (external link, opens in new tab) אבל מכיוון שהם חיים הרבה פחות זמן הם עברו פחות לקוחות אז הם מימשו פחות פיצ'רים לאט לאט הם עוברים על עוד ועוד פיצ'רים לדוגמה עד לפני כמה חודשים אם רצית להשתלט על אובייקט שעוד לא נוצר על ההתנהגות של אובי קים שעושים להם ניו בתוך הפרודקש קול אז רק טימוק יודע לעשות את זה היום ג'סמו גם יודע לעשות את זה אז לאט לאט הוא מסיג בעות ועוד יכולות ההבדל במחירים ככל שזכור לי 800 דולר לליסנס 400 דולר לליסנס שתבינו את ה את הדברים האלה
[14:58] (external link, opens in new tab) מצד שני טקו הוא קיים בערך שמונה שנים עכשיו והוא עבר אלפי אלפי לקוחות עם לגסיקוד פשוט נוראית אם אתם חושבים שהלגסיקוד שלכם מפחיד אז אני אומר לכם שהוא לא רע בכלל יחסית ג'סמו קיימים בערך שנתם וזה באמת גם ההבדל מבחינת הפיצ'רים ms זה פרויקט שהתחיל מבחור בשם פלי שפעם לא עבד במייקרוסופט ויצר פרימוק בשם MbUnit משום שמעל MbUnit ובחור מאוד חכם מאוד מאוד נחמד ואז הוא התחיל לעבוד במייקרוסופטarch
[15:29] (external link, opens in new tab) לפני בערך שלוש שנים אני והCEO של טייפיטמוק נסענו לרדמונד כדי לבקר את החבר'ה של מייקרוסופט שם ולהראות להם את טייפיט בגלל שהיה איזשהו דיון אולי כדאי שטייטמוק יישולב בתוך סטודיו בגלל שהוא נורא עוזר לטestינג של SharePoint מייקרוסופט נורא נורא רצה לדחוף את שרפט באותו זמן ובין השאר גם יצא לנו לפגוש את פלי והחבר'ה שלו ם יצאו באותו זמן כלי שנקרא פקס מישהו שמע על פקס פקס מג'נרד testים הוא מסתכל על הפאס של הקוד שלך ומג'נרט testים שעוברים על כל הפא זאת אומרת כל הרange casesס תחשבו על זה ככה זאת אומרת הוא הוא הוא הוא תוספת נחמדה ליוניטestים אחרי שכבר יש לך testing הוסיפו עוד מלאק
[16:13] (external link, opens in new tab) Test בינטגרש ויש לכם אחלה coverage (external link, opens in new tab) ואז בין השרנו את זה לחבר'ה של פקס והנה שלושה שבועות אחרי זה הם יצאו עם כלי שנקרא Moles (external link, opens in new tab) מולס משתמש בפרופיילר API כדי לעשות פייק לכל דבר הוא עובד באותה באותו באותו רעיון של הפרופילר API אבל API שלו אחר לגמרי ונוראי אבל הוא עובד על אותו רעיון אז שתבינו טג הייתה די חלוץ ואז אז וואלה אנשים התחילו להשתמש באותו רעיון זה הסוג של אגוטריפ מבחינתנו אבל גם נורא התעצבנו כי זה אומר שגם טייפ לא נכנס לויזל סטודיו בסוף אמ
[16:51] (external link, opens in new tab) עכשיו במס הכלי הזה הוא חינמי ובעצם סטודיו 2012 Moles נקרא מייקרוסופט בגרסה הבאה שלio יש לכם את הדבר הזה build in והוא משתמש בפרופי API והוא מאפשר לכם לעשות חיק כמעט לכל דבר כל אלסטם time בגלל שחבר'ה עובדים בתוך מייקרוסופט יש להם גישה לעשות קוד יותר מסובך מבחינת המימו של הפרופיילר API יש להם יותר ידע אז הם הצליחו איתם אפשר למרש כמעט כל דבר עכשיו מבחינת הזabity של הפיורק הוא מאוד גרוע כרגע עד שהabילity הזה לא ישופר לא הייתי ממניס להשתמש בדבר הזה אבל שווה בהחלט להסתכל על זה כי הגישה שלהם מבקי היד היא שונה לגמרי מבחינת שני הדברים האחרים הגישה שלהם היא שלכל קלאס שיש לך במערכת הם מג'נרטים לך קלאס אחר
[17:38] (external link, opens in new tab) שעליו אתה יכול לעשות delegגטatס לכל פונקציה ובדלגס אתה אומר על הפונקציה איך להתנהל אז אתה צריך ללכת לכל פונקציה ולהגיד הפונקציה הזאת היא delגate שזורג אספש פונציה הזאת היא דלגטיר שלוש מבחינת מטן זה מאוד בעייתי אבל הכוח הוא כוח מאוד מאוד חזק אני עדיין לא אוהב את הAPI הזה אבל אין ספק שהם עשו פה משהו שהולך לעזור להמון מפתחים להתמודד עם לגסי בצורה מאוד מאוד טובה המיטבילטי יכול להיות שהוא שהמחיר שישנו הוא קצת גבוה כרגע לכן לכן אני עדיין לא ממליץ להשתמש בדבר הזה למרות שהוא חינמי.
[18:12] (external link, opens in new tab) אני מקווה שיעשו בזה הרבה שינויים כדי שבגרסה הבאה זה כבר יהיה יותר טוב. אבל מה שמעניין זה שלדוגמה במולס מולס בעיקר נועד כדי שתוכל לכתוב testים בפקס כדי שפקס שהוא נתקל בדברים בפס שמשתמש בפייל סיסטם אז תוכל לעשות פה פייק אוטומטית. מולס בדרך כלל לא נועד לעשות וריפיקציות אז במולז אין פי שמשהו נקרא במולז אתה לא יכול לעשות אתה יכול לכתוב הסרט משלך תכתוב delגט שעושהפג לטרו שמה שהוא נקרא אבל אין very verifיפקש
[18:43] (external link, opens in new tab) אי אפשר לעשות דברים לביס classes זאת אומרת מבחינת לגסיקוד עדיין חלק מהיכולות הם לא חוספים אז צריך להבין שהיום אם עובדים עם לגסיק הדבר הזה פחות מתאים למרות שהוא מתאים ל לדברים שיסיים לא רק שאלות לגבי הרבה ההבדלים בין הפרמוקים האלה זה חשוב מאוד שכשבאים לבחור framewor מבינים אם זה conסטרrain או uncוstrain הנקסטרrain נותנים לכם את היכולת לבחור את הדיזיין שלכם הקונסטרra לא נותנים לכם יכולת
[19:13] (external link, opens in new tab) כי בקונסטרrain זה אומר שאתם יכולים אך ורק להחליף מימוש של פונקציות שאפשר לממש בעצמכם אז זה חייב להיות וירטואלי חייב להיות nonסal אסור שזה יהיה סטטי לדוגמה אסור שזה יהיה prvטate protected אולי כי אפשר לרשת מהקס צריך להיות כדי לממש את הפונקציה בעצמכם אז מבחינת הדיזיין של איך הקוד צריך להיראות הפריורקים האלה במידה מסוימת בגלל הקומפייר מכתיבים לכם איך הדיזיין שלכם צריך להיראות כדי שתוכלו לעשות טestינג זה לא בהכרח דבר טוב
[19:43] (external link, opens in new tab) לפעמים זה בסדר לפעמים לא זה לא אבל אסור לתת לפרורקים האלה לקבוע את הדיזיין כולו אתם צריכים לדעת דיזיין טוב בלי קשר לפרוורקים האלה אתם יכולים לעשותפרורק שהוא מאוד testable אבל הדיזי עדיין יהיה גרוע בסדר מבחינת הזביליות שלו אולי testable אבל לא בהכרחable הפרוקים האלה נותנים לכם את היכולת לבחור הם נותנים גם את מה שאלה נותנים לעשות פייק לאינטרפייס וכולי אבל אם יש לך משהו שהוא סטטי הם מאפשרים לך להשתלט עליו גם וזה באמת ההבדל ביניהם לכן והם עולים כסף בגלל שנורא מסובך לממש אותם דבר אחד שלא עולה כסף זה מוז אבל מוז לא נותן את כל היכולות שצריך בדרך כלל בלגסות
[20:24] (external link, opens in new tab) אוקיי אז בוא נראה אני אראה לכם את הטestטים עכשיו עם חלק מהפריים האלה ואחרי זה גם עם טיפרקסטו ו ואז אנחנו נראה לי נעשה הפסקת צהריים אז אם עד עכשיו כתבנו את לפני הטestטים של לוגog שקורה לקרוא ללוגר או לקרוא לובוב סרביס לוגoger זה רק אפtion כן,
[20:55] (external link, opens in new tab) ככה זה נכתב בNITס, למרות שאסור לנו להשתמש בזה. זה הדוגמה הכי בסיסית לפרו שמייצר משהו בצורה דינמית. זה משהו שהוא בלילט בניט, לא מומלץ להשתמש בו, אבל נורא נחמד להסתכל עליו כסוג של learning experience, לראות את האבולוציה של הפרימוקים האלה לאורך זמן. אז בIT Moקס כדי ליצור פיקר לא צריך ליצור קלאס משלך. אתה יוצר דבר שנקרא דינam. למרות שהדינamמיק מוק יכול להיות גם סטב מילה מוק היא מאוד מאוד קיימת בכל השכבות האלה אתה אומר לו איזה טייפ לממש איזה טייפ לרשת ממנו
[21:32] (external link, opens in new tab) ואז אתה אומר לו תשמעט שפונקציה רס תקרא עם הטקסט הזה בסדר >> אז תשימו לב גם שזה סוג של equals אין פה אז אי אפשר אי אפשר להגיד על הפרמטרים סוג של קונסטרינטים חשובים או לא חשובים זה כמו הסרט אז אני אומר לו expectect ואז אני מייצר את הlogin manager with איך אני עושה את זה אני נותן לוק log הזה שיצרתי מהדינam אני נותן לו יש לו propery שנקרא mo instance שמחזיר object
[22:12] (external link, opens in new tab) אבל מה שיפה זה שכשאני עושה לו cט לilלגר ברט timeים בצורה קסומה זה פשוט יעבוד הוא יתאים לאיילוג כי בעצם הקוד הזה מקפל בנטיים קוד שיורש מאיילוג ואז במוקס אני אקבל את הדבר הזה שנראה כמו אבל כל פעם שקוראים לפונקציה שלו הוא בסך הכל שומר את הול ואז בסוף אני אומר verifיפי פה הverיפי הולך לכל הדברים שעשיתי להם אקפקט קודם פה לדוגמה ועושה אסרט על כל אחד ואחד מהם שזה נקרא
[22:50] (external link, opens in new tab) אז ברמה מסוימת זה ממש נחמד זה חסך לי את העבודה של הכתיבה של כל הקלאס הזה ובאמת כשיו מוקס היה אחד הפרמוקים היחידים מלבד עוד דברים כמו eyמוק שאנחנו אפילו לא נראה פה אז באמת היה התקדמות לעומת כתיבה של הדברים האלה בצורה ידנית הנה הנה הדרך לכתוב את זה עם מוק וסטאב אני יוצר דינam מוק שלer דינam מ שלice ואני אומר ללגר expect and throw בקריאה לר new loger exception
[23:23] (external link, opens in new tab) כאשר כאשר אתה מקבל את הפרמטר שנמצא בזאת. בסדר? אז בעצם מה שאני אומר לו כשמישהו קורא כשמישהו קורא לפונקציה right עם פרמטר תזרוק את האקספtion. אך ורק אז הוא יזרוק את זה. אין לי דרך להגיד לו תזרוק את זה לא משנה מה. אין לי דרך להגיד לו תזרוק את זה אם יש y בתוך הסטרי. זרוק את זה אך ורק עם הסטרינ שווה ליו אז אם מחר יש לי הרבה אינפוטים אני צריך להוסיף expect throw לכל אחד מהם
[23:54] (external link, opens in new tab) אבל זה לא רק expect throw זה גם throw וזה גם expect זאת אומרת אני גם אשתמש בזה כסב אבל כשאני אקרא לverיפי הוא גם יעשה על זה הסט תשימו לבעיה פה אני משתמש בסטאב שלי גם כמו בטest הזה לא אכפת לי אני לא הנה זה המקובקט שלי אני אומר לו expectect לר עםג exception אחלה מצוין הבעיה היא שיש לי פה גם מוקס
[24:36] (external link, opens in new tab) אבל כשאני עושה verיפי מה שיצרתי זה בעצם שני מ objects בטest הזה ופעם זה זה די היה הסטנדרט שכל דבר שהוא פייק הוא היה גם מוקט פעם הסטנדרט היה תעשה וריפיי לכל מה שיכולת בגלל שאתה יכול. היום זה הרבה יותר מובן שזה לא רעיון כזה מדהים אבל פעם לא היו את הפרטיס. אנשים היו צריכים ללמוד בדרך הקשה גם אני למדתי את זה בדרך הקשה. פעם גם אני הייתי עושה את זה. היום אני יודע אם יש לי יותר ממוק או obקט אחד אני לא רוצה לעשות את הדברים האלה אז אני אף פעם לא עשה וריפיי על הכל אני תמיד עשה וריפיי על משהו ספציפי אבל בוקס אין לי שום יכולת כזאת יש גם עוד בעיות של maintainity פה right כתוב כסטריק מחר אני משנה את השם של הפונקציה אני צריך ללכת לשנות את כל הטestטים אני לא יכול לעשותקטורים
[25:19] (external link, opens in new tab) אז בעיה של מטן גם שאלות לגבי זה אוקיי איך הדברים האלה נראים ברימוקס? עכשיו דברים נראים קצת יותר נחמד. אם אתה רוצה לייצר fake iloger אתה אומר mo repositorygenate יש לי גם generate stub (external link, opens in new tab) של i loger מה שאני מקבל חזרה זה אין לי איזה משהו שעליו אני אשלח propפרerטy מאתחיל את הlogגin maner with ישר עם המקל loger שלי
[25:52] (external link, opens in new tab) שימו לב אין לי פה expectect אין לי פה שום דבר כזה יש לי בסוף mlog assert was cold ואז יש לי פה lדה express אני אומר בינתן logger עכשיו הloger פה פה זה תמיד יהיה השם של הדבר הפייק פה. זאת אומרת הם לא צריכים להיות באותו שם אבל זה תמיד תייחס לאותו אובייקט ביןגר כלשהו שהוא שזה שזה הפייק שאתה מייצג אז זה היה צריך לקרות logger. עם הפרמטרים האלה עכשיו תשימו לב זה arang וסט בדיוק כמו שעשינו קודם בניס זה היה arange אבל הפק היה חלק מהר אז כדי להבין מה יש ביפי היית צריך ללכת עוד פעם לתחילת הטest כדי להבין הרange והסט ברמה הזאת הוא הרבה יותר נחמד דווקא הפרורק הראשון שיצא מסוג של הרange אט לא היה רינוקס היה מוק Moq (external link, opens in new tab)
[26:42] (external link, opens in new tab) אה ארינוקס היה אם אני לא טועה הראשון שוריד את צורך לכתובנגים בשם של הפונקציה. תשימו לב שאין לי פה שום strיingנ בשם של הפונקציה. יש לי פה לנדה expppression ואז אני יכול לעשות loger. נק. אז מה שנחמד זה שאם אני עושה refacoring לרשם לשם אחר, כל הטestטים שלי גם משתנים אוטומטית. מבחינת מטן זה הרבה יותר חזק. זה הAPI האחרון של RS. יש ל עוד שני API שנורא קל להתבלבל באיזה להשתמש בכל שלב.
[27:15] (external link, opens in new tab) זאת אחת הסיבות שאני לא מאמץ להשתמש בו. הנה פה זה הטestט השני. עוד פעם אני רוצה לעשות פייק לאילוג ואני רוצה שהוא יזרוק exception. אז אני יכול להגיד לו stלog expect. שים לו שק מרגיש כמו משהו שאני אעשה לו verifיפט שלי אחרי זה יהיה רק על פונקציה אחת. תכף נסתכל עליו. אוקיי סליחה אז expect loger right ואז נקודה thr
[27:47] (external link, opens in new tab) New ler reception יש פה עוד משהו שהשתנה תשימו לב שהapi עכשיו הוא יותר fluent expectect מחזיר לי את אותו אובייקט ואז אני אומר נקודה throw אין לי פה שתי קריות נפרדות או expectected throw אז כאשר מישהו קורא לoger right yo אז תעשה throw לoger exception יש לי גם את היכולת להשתמש בargument matס אוקסטרים על הארגומנטים ולהגיד כל דבר או אך ורק חלק מהדברים זה גם אחד הדברים שרינו מוקס הציג יחסית מוקדם >> אפשר שאלה >> כן >> אה הסטוס כל כאילו קורה אחר כך אם אני קראתי לו כמה פענים הוא שומר את כל אחת מהקריות שלי כדי לדעת מה קרה >> כן הוא שומר את כל הקריות שהיו קודם ולכן אחד הדברים שרינו מוקס גם עשה יפה זה שהוא בניגוד לnitס הוא nonןסטקט
[28:35] (external link, opens in new tab) פעם הוא היה סטריקט אבל גם זה השתנהט מס אומר שאם אמרת לו שהוא מצפה אז הוא מצפה רק פעם אחת בגרסאות היחסית חדשות של כל הפרימוקים הם כולם נוסטריקט מה שאומר אתה אומר לו זה היה צריך לקרות אבל לא אכפת לי אם קראו דברים אחרים ולכן הם שומרים את כל הלוג של הקריאות ואם זה קרה אפילו באחד מהם זה פשוט עובר אז מבחינת מינabity אם מחר הוספת עוד שתי קריאות שלא אכפת לך מהם הטסט לא נשבר בסטריקט מוקס בדרך כלל שוברים את הטestינג מאוד בקלות אז testסט הם מאוד סטריגי לך ישר כן
[29:10] (external link, opens in new tab) אז גם פה assert was called servr עם exception גם אם קראו לסרס עוד 13 פעמים לפני זה וגם חמש פעמים אחרי זה בעבר זה קרה פעם אחת ולכן זה מה שחשוב >> והטר קורה ברגע >> סליחה >> קורה ברגע שזה קורה >> הרו >> כן >> הרו קורה כן בדיוק שזה כשראי הרו קורה כשהשורה הזאת רצה הוא קורה כשהשורה הזאת רצה >> שאלה >> כן >> יו זה אין string במקרה הזה >> לא יו זה לא any string יו זה אקטס string במקרה הזה אני תכפר לכם קונסטרנטים אבל אני לא רוצה לבלבל אתכם עכשיו עם של קונסטרנטים ברינו כי אני לא רוצה שתשתמשו ברנו
[29:48] (external link, opens in new tab) אני אציג לכם את זה במוק אני אראה לכם את הקונסטרנט אבל יש פה את הap שאתה יכול להגיד לא אכפת לי איזה סטרים נשלח גם באסרט וגם ב בסטאפ בקפ >> הדפולט הוא כאילו exact >> הדפט הוא אז exact בפריורקים האלה אתם תראו שבטפem הדפט הוא דווקא הפך בטyוק הדפט שלא אכפת לו מהסרים ששלחת אלא אם כן אמרת לו שזה אקז וזה אחד הדברים שטייטמו הוא יחסית שונה שהבנו שבדרך כלל רוב המקרים לא אכפת לך מה אתה שולח אתה תמיד רוצה את ההתנהגות הזאת למשך הטקסט דווקא ציפיתי שעד עכשיו רוב הפרימוכים כבר יבינו את זה אבל אה זה עדיין לא פעמים
[30:25] (external link, opens in new tab) עוד שאלות אוקיי >> אם יש שבקט מסובך בפונקציה אם זה לא הנקודה right string אלא נקודה right מקבל עכשיו איזשהו אינסטנס >> כן איך אנחנו אנחנו צריכים עכשיו לעשות סטאב מזה איך אנחנו להשבות אותו כאילו זה הולך יותר מסובך אז זה הולך להיות יותר מסובך ואני אראה איך איך עושים את זה וגם יהיה לכם תרגיל שאתם צריכים לצפות שהוא קיבל אובייקט עם פרerטז מסוימים >> אוקיי >> אבל בדרך כלל מה שקורה זה שיש argument mature שאומר קיבלת למדה של אובייקט שנראה ככה ואז אתה אומר שהאובייקט נקודה propפרery שווה שווה אבל שם זה כבר מתחיל להיות מסובך ושם כבר עדיף לכתוב handen
[31:03] (external link, opens in new tab) כי הטest יתחיל להיות בלתי קרי אז אנחנו נגיע יהיה גם לזה. טוב, בואו נעבור חזר למוק ונראה את ההבדלים. הדברים האלה לא הפטנו כרגע. אוקיי, אז זה הטest הראשון במוק. אני מייצר מוק של ב-Moq אין את המילה. הכל נקרא מוק, שזה אחד הדברים שמפריעים לי. אחזות שאני לא כל כך אוהבת מוק זה שעדיין מבחינת הAPI אין את ההבנה שבדרך כלל אתה לא צריך מוקט.
[31:34] (external link, opens in new tab) אין אין בכלל את ההפרדה ביניהם. אז אני אבל מה שאני מקבל בעצם זה לאגר אלא מוק של מוק שלגר זה אומר עם קונטרולר כזה שבו אתה תעשה עליו verifיפי אחרי זה תגיד לו את ההתנהגות אבל כדי לקבל את הפק objectט עצמו יש לו propפרy שנקרא object פה log object מהבחינה הזאת זה דומה לMO instance שהיה ב-NUnit mo אז הobect פה ההבדל הוא שזה לא object זה i loger בגלל שאני משתמש בגנenקס הבחינה הזאת זה יותר נחמד, לא צריך לעשות custing וכולי
[32:08] (external link, opens in new tab) אני אומר is login אוקי ואז אני עושה verifיפי תשימו לב עכשיו verifיפי ופה כבר יש פה קסטרrain אז אני ניתי בכוונה דוגמה של כמה מכוער זה יכול להיות לא בגלל מוקס זה מכוער בגלל זה יהיה מכוער לא משנה מה אם יהיה לכם יותר מדבר אחד verifיפי ותשימו לב אני אין לי פה expectect יש לי verify logr ואם אני רוצה לבדוק פרמטר אני יכול להגיד it is of string ואז יש לי פה למדה ואני יכול להגיד שהstring
[32:38] (external link, opens in new tab) A וsting conts b זה כל זה לפרמטר הראשון כי אם יש לי שני פרמטרים לבדוק יהיה לי עוד שורה כזאת אני חייב לכתוב שורה פרמטר אם יש לי קונסטר ואז אני יכול גם לכתוב שזה נקרא לאפס פעמים אומס at list בדרך כלל אני ממניץ לא להשתמש בפרמטר הזה בכלל ואז הוא עושה כן
[33:20] (external link, opens in new tab) למה זה שיניתי בגלל ששיניתי את הtest אמרתי times never עכשיו מן הסתם אתם רואים שהטest הזה נכשל אין כאן שומר לי dude you just broke it הדוגמה של ה עכשיו עוד דברים ש אה תכף נראה יש עוד כמה דברים במוק שהיום זה יש כמה סיבות שהיום אני לא ממליץ להשתמש במוק למרות שהמון אנשים עדיין משתמשים בו כי הוא הרבה יותר טוב מבחינת היוטity מרן אומ אנחנו נראה שמבחינת יוזבילטity יש כבר היום דברים שלדעתי יותר טובים כבר ממוק אז הגיע הזמן להתקדם קצת הלאה
[33:52] (external link, opens in new tab) הנה הטest עם מוק וסטאב קיצור סטאב לogג ביצירת מוק של אילוגר שימו לב כמה זה מתחיל לבלבל עכשיו אבל עכשיו אני אומר לו ככה התנהגות setup אין פה כבר את המילה expפק שזה כבר טוב setup וינתן x מה זה x זה תמיד הפיק אקט שלך אם מישהו קרא ל x right יכולתי גם לכתוב פה לogתו פה משה זה לא משנה אוקיי זה סתם למדה אקפר אבל זה תמיד זה קצת עדיין מבלבל רוב האנשים שרואים את זה בפעם הראשונה לא מבינים שמה שאני כותב פה מתייחס לפייק objectקט שאני אשלח
[34:28] (external link, opens in new tab) צריך להתרגל לזה והנה אתם Eh