Lesson 10 of 22

Advanced Mocks and Stubs

Duration: 12:50 Watch on YouTube (external link, opens in new tab) Spoken in Hebrew

Markdown version

In this lesson

Roy Osherove continues with Moq (external link, opens in new tab), showing callbacks, Verifiable and VerifyAll, and overriding protected methods, and warns that verifying many interactions you do not care about is overspecification (external link, opens in new tab), explained with a story about sending his son to buy pizza. He then writes the same logger tests with FakeItEasy (external link, opens in new tab), whose API starts with A and whose error messages he finds better than Moq's, and with NSubstitute, and recommends starting with one of the newer frameworks. Asked about profiler-based frameworks (external link, opens in new tab), he says they run slower but are used to get coverage (external link, opens in new tab) on legacy code (external link, opens in new tab) before refactoring (external link, opens in new tab).

Transcript

1,803 words

[00:03] (external link, opens in new tab) הloger שנקרא לו x אם מישהו קורא right in is any string אז תזרוק exception תיצור m service תשלח את הסog object ואת הm service object לקrctטור ואז תעשה verify שבנתן הסice שימו לב אני אומר על המקרice verify service verify service service right exception אז יכולתי גם להגיד ‏right it is any string ואז העיקר שהוא נקרא הטest הזה היה עובר כן

[00:35] (external link, opens in new tab) >> האובייקט שאתה מעביר שם ללמדה זה יכול להיות כל אובייקט נכון זה לא אובייקט מה שאני אומר פה זה סתם אקספרש הפרמטר כאילו שאתה נותן ללמדה לפני החץ זה יכול להיות כל אובייקט זה כל שם זה לא זה לא אובייקט הsvc פה לא קיים בשום מקום אחר SVC לא קיים תעשה אני עושה פשיט 7 אתה תראה שהוא לא נוצר בשום מקום אחר הוא לא קיים בטסט הזה זה סתם שם זה declarative אם אני >> איך הוא יודע שיש לזהר right כאילו זה השאלה >> מכיוון שזה מכיוון שהמוקסרס

[01:08] (external link, opens in new tab) הואגנריק זה מוק (external link, opens in new tab) שלי הבנתי >> זה מה שגורם לו לדעת שיש >> כאילו יוצר קוד ברגע תסתכל על החתימה תראה שזה void mo של iw service >> אוקיי >> ומה שהוא מקבל זה system link expression system action של servicי שמכיר זה דלגate שמקבל אtשן שיש לו פרמטר אחד מסוג ובסרביס אוקיי יש לי עוד שאלה מספר

[01:38] (external link, opens in new tab) כאילו הדבר שנראה לי הכי פשוט אם היה זה הייתי אומר כל פעם שנקרא right תריץ אתניסגate שני כותב כאן ובו הייתי כותב איפה אתה באמת ארוע הדבר הזה אז כאילו ממש להחליף ממש להחליף את הפונקציה >> כן בכל בכל הטסט בכל הפקים החדשים יש את היכולת לתת קבק שפה אתה עושה את המימוש האחר לפעמים זה רעיון לא רע לפעמים זה יותר פשוט מאשר לעשות הבריכה קריק אנחנו דינים לקרוק שרט שר >> זה זה יותר קרי אם אף פעם לא כתבת טestטים ככה ברגע שאתה רגיל לראות את הטestטים ככה אז הרבה יותר קל לראות את זה באסרט למטה מאשר לראות הסרטים באמצע הטסט וואו איזה ריח טוב אבל לפעמים

[02:17] (external link, opens in new tab) אין שום ברירה ובאמת חייבים לעשות callק אז אני יכול להגיד במקום אני יכול להגיד פה callבק ופה אני מקבל פשוט אני יכול לעשות פה מה שאני רוצה לזרוק אספtion תחזיר שלוש מה שזה לא יהיה ופה אני יכול גם לכתוב הסרטל עכשיו הנה פה יש עוד כמה קטג'ים יש API במוק שמאפשר לך לעשות כזה דבר לא רק שזה frow גם תעשה לזה בסוף נקודה verifyable מהיפיable אומר

[02:48] (external link, opens in new tab) יפיבל אומר אולי בסוף אני ארצה לעשות על זה גם וריפי תשמור את המידע הזה ככה בשביל בשביל הכיף בשבילי ואז אני לא חייב לעשות m servicy אני גם יכול לעשות ככה service verify או verify all verify all הולך על כל הverifyable שהיו לי קודם ועושה להם מתי בדרך כלל תראו verifyable כשיש לכם multipl

[03:20] (external link, opens in new tab) Object בדרך כלל מבין אז בדרך כלל אם אתם רואים verifyable זה אומר שבדרך כלל משהו לא טוב הולך לקרות יהיה בדרך כלל וריפייבל יש יותר מאחד זה אומר שיהיה לכם אתם עושים מסרט על הרבה אינטראקציות בדרך שלא אכפת לכם בכלל זה סתם סטאב (external link, opens in new tab) מה אכפת לכם שמשהו קורה >> אבל זה היה סכום >> מה >> זה היה לך עושה למוקסרביס למרות שזה היה >> יכול להיות מוקר לא משנה >> אוקיי >> אסטבלוג סליחה >> זאת אחת הסיבות שאני אוהב לתת שמות למשתנה

[03:52] (external link, opens in new tab) אם אני רואה פה וואלה stל verifיפיי כבר אני יודע שאני לכתחילה לא הייתי אמור לעשות וריפיי לדבר הזה אבל כשאני מסתכל על טסטים הדבר הראשון שאני מסתכל וואלה אני רואה פה שני verifיפיי כבר לא כבר בעיה לפעמים אני סתם רואה veryיפי all ואז אני מחפש וואלה יש לך פה שלושה verifיפיable אבל מה אכפת לך שבדרך הוא קרה למשהו העיקר שקיבלת את הריז בגדול תחשבו על זה אם יש לי הרבה וריפיable בדרך הדרך שאני חושב על זה זה תחשבו אני שולח את הבן שלי לקנות לי פיצה בסדר הוא כבר בן 5 וחצי הוא כבר די גדול אני שולח אותו לסוף הרחוב נותן לו 100 ש₪ ואומר לו לך לסוף הרחוב תנה לי פיצה אתה תבקש שיהיה ככה גם פטריות וגם זה אבל אתה צריך להגיד לו בהתחלה שלום אדוני המוכר בן של רועי כרגיל אני רוצה את הפיצה הזאת תודה ואז נעבור שעתיים הבן שלי חוזר אולי מוקה וחבול אולי הוא חוזר הביתה ואתה יודע אבל הוא חוזר עם הפיצה ביד והוא אומר אבא היקר אני הבאתי לך את הפיצה אני במקום מסתכל על הפיצה אני מתקשר למוכר אומר לו תגיד הגיע לך איזה ילד בן 5 וחצי האם הוא אמר לך בדיוק את המילים האלה

[04:52] (external link, opens in new tab) הוא לא אמר את המילים האלה ואז הוא לוקח את הפיצה של הבן של זורק אותם לפעמים אני אומר לא אכפת לי אז זה מה שאני עושה במקום שיהיה אכפת לי מהדריזט אכפת לי איך קיבלתי אותם והטestטים כשאתם משתמשים בוריפיable ובכלל על אינטראקציות שלא אכפת לכם זה מה שאתם עושים הט שלכם יתחיל לבכות לכם כל פעם ששיניתם משהו באינטרנal impלמנש במקום שאכפת לכם מהריזלט שלכם יגיד אבל אמרת שזה יקר ככה וזה יקרה ככה לא אכפת לנו אז אם אני רואה verifיפיable בדרך כלל זה סימן לא פה

[05:24] (external link, opens in new tab) בסדר בסדר? אנחנו נראה אנחנו נעשה קצת טest רוwז אולי מחר אולי היום נראה איך הדברים ילכו ואתם תראו שהדברים האלה קורים די הרבה דווקא ועוד פעם קורים בגלל שככה אנשים היו רגילים לעשות את זה בגלל שפעם זה היה נחשב בסדר אמ אני גם יכול גם עם הפריורקים האלה גם עםוקס אני יכול לעשות overriד את דברים עם methodס זאת אומרת אם יש לי פה פונקציה שהיא

[05:56] (external link, opens in new tab) אני יכול לעשות over לפונקציה הזאת בטestים שלי כל זמן שהיא אוed או public אני יכול להגיד protected set up to l verify שימו לב ואז אני עושה verify שזה באמת נקרא אם זה פאליק הייתי יכול לעשות פשוט verifיפי על publicקוד איך שהייתי רוצה אבל פה בדברים האלה בורטל metodס אני אראה אני לכם ממש לעשות את זה בצורה ידנית ואני אלמד אותכם איך לעשות את זה גם בהמשך היום.

[06:35] (external link, opens in new tab) עכשיו בואו נראה את הפריורקים הקצת יותר חדשים. FakeItEasy (external link, opens in new tab). FakeItEasy זה framewor. עוד פעם זה constrain framework אני אוהב את השם שלו. מה שנחמד בו זה שהכל מתחיל באות A מבחינת הAPI. אני רוצה לצר פיקלגר אני אומר A. ‏IOG קיבלתי חברה אני שולח אותו ללגן manager with more אני אומר אני רוצה לעשות ver אני אומר A call 2 שימו לב יש פה אין פה שום פרמטר אני פשוט משתמש ביק ישירות to fake cite with string ignored must happen

[07:08] (external link, opens in new tab) יאלה חמוד נכון מה שנקרא לקחת את זה עד הסוף שימו לב איזה פשטות איזה סוג של אלגנטיות יש פה וזה אחד הדברים שאני אוהב בפרמורקים האלה, הפשטות הזאת האלגנטיות. דרך אגב, עוד דבר מאוד טוב בפרמורקים שהם לא מ שהerור מessage שלהם הרבה יותר טובים. כשהטest נכשל ציפית לזה אבל קיבלת משהו אחר. הארורים במוק היום הם די גרועים. וא צריך לכם קצת להרגיש את זה. הארורים בפיק ובין subבסיט מה שאנחנו נראה הם ממש טובים.

[07:40] (external link, opens in new tab) נורא אכפת להם היובליות של הדברים. הנה הטestטים מוק וסטאב. תיצור אפיק אילוגר. תיצור fake i web service ואז אתה רוצה לעשות שver אז אתה אומר call to fake logger right with a string ignored throws new loger exception מצוין ואז אני מייצר את הlogin manager with m and st לא לא מה שהתכמנתי ואז אני בסוף אומר to fake web service with a string that

[08:13] (external link, opens in new tab) Contains got exception בסדר זה גם זה מתחיל להיות קצת קצת ארוך מדי אבל זה יותר קרי מהלמד אקספרש שלנו קודם אוקיי שאלות מדליק לא אוקיי אז FakeItEasy הוא באמת אחד מהפרwים שאני ממש ממש אוהב גם בגלל שיש לוle point of entry אבל NSubstitute (external link, opens in new tab) הוא הפריורק השני שאני גם בדdיל קבתי גם אותו הוא ממש ממש נחמד.

[08:47] (external link, opens in new tab) תשימו לב דרך אגב לגבי API פה אין פה את המילה מוק ואין פה את המילה stב הכל נקרא פק שאולי בגלל זה זה קצת מקל עלינו באסבסט גם אין את המילה stב יש רק subבסט שזה כמו לקרוא לזה פייק אני רוצה ליצור את logger אני אומר substitute for ilogger אני רוצה ליצור את הlogin manגר אני שולח לו את הake logger ואני אומר ככה הake received קריאה לri is string שהוא contains ככה וככה אין פה גם את הלנדה אקרש אני פשוט אומר שמשהו res

[09:21] (external link, opens in new tab) ואז ואז מה שאני מקבל זה משהו שנראה כמו אני פשוט קורא לו את הפונקציה כמו שהייתי קורא לה קודם איפה אני כן צריך למדוט אם אני רוצה לעשות argument constr אז גם פה הapi ממש ממש חמוד וחכם הנה דוגמה לapi שיש לי וסב substitute for i web service substitute לiloger fake ‏loger loger right עם r string אז do

[09:51] (external link, opens in new tab) Th new exception לדוגמה אני גם יכול להגיד לו פה פשוט אין לו פלא שכחתי אני חושב שהם פשוט הורידו את הרו הזה אז פשוט תזרוק איזשהו exceptפtion ואז תיצור את הake service ואז תגיד received right in עם any str אם אני רוצה לעשות conסate יותר מארגומנט אחד זה עוד שורה יש לך ארפל אגומנטס בסדר אז יש לך זה לא עוד שורה זה עוד פסיק ועוד ארגומנט

[10:30] (external link, opens in new tab) אז תשימו לב איזה הבדלים בAPI יש פה אבל בכולם יש את אותם יכולות עוד לא עברנו על דברים חוטי כמו קייס או לאטור וכולי אנחנו נעבור עליהם אחרי ארוחת צהריים מה שנעשה גם אחרי חת צהריים אנחנו גם נמשיך את ה את התרגילים איפה שתראו את המילה מוק אתם יכולים לבחור איזה שאתם רוצים מבחינתי FakeItEasy substitute או FakeItEasy אוסב איזה שאתם רוצים בסדר אני לא מסנשברים אתם יכולים שנש במוק אם אתם רוצים אני ממליץ כבר להתחיל עם אחד מהחדשים כי אני מאמין שהם העתקיד של הפמוקים היום יש להם יחסית מעט משתמשים כשכתבתי את הספר שלי למוק היו מעט מאוד משתמשים גם וריינו מוקס היה ככה ומוק היה ככה מבחינת ה השאלון שעשיתי הסקר שעשיתי היום זה בדיוק ככה למוק

[11:15] (external link, opens in new tab) ולפריורקים החדשים האלה אבל אני חושב שהפרוקים האלה בהחלט מייצגים את לאן אנחנו הולכים וכולי שאלות שהיית לא שאל שאל >> ברוב חברות שהיית חשוב בסוג של הפרופיילינג או בסוג של הפרוקסיז >> ברוב משתמשים בפרוקסיז כי הפרופיילינג עונים הרבה כסף אבל בחברות שמשמשים בפרופיילר ללגסי קוד הם בדרך כלל אומרים שאין תחליף לדברים האלה וזה נכון הרפקטור שצריך לעשות לגסיק בדברים של פרופיילינג הוא כמעט בלתי אפשרי לעשות אז זה דרך טובה מאוד לקבל coverage (external link, opens in new tab) ואחרי זה לעשות פקטור

[11:59] (external link, opens in new tab) מבחינת הביטויים הפרופיילר מול האלה שבים על פרוקסי יש כאילו הבדל גדול >> יש הבדל די גדול זה בדרך כלל יכול לקחת v2 מבחינת הזמן של האקסקיושן שלס >> וזה עדיין זה עדיין מתאים כאילו לtd למשל >> כן כן זה מתאים זה תראה בטייפוק היה לנו כמה אלפי טestטים טובים על הפריימורק של הAPI וכולי לקח להם כמה דקות טובות לרוץ אבל זה עדיין השתמשנו בזה לא הרצנו אלפים אבל הרצנו 1000 טסטים בדרך כלל שהיינו כותבים

[12:29] (external link, opens in new tab) כל רבע שעה או חצי שעה היינו מריצים את כל הטסט ככה ליתר ביטחון כל פעם שהינו עושים קומית גם ככה היה לנוקסגרש שהיה לנו אומר לנו אחרי חמש דקות מה קורה זה לא היה כזה נורא בכלל אבל באמת הם כולם רצו בזיכרון אבל הפרופיילינג בהחלט לוקח יותר זמן. אוקיי? אז בתיאבון ניפגש עוד חצי שעה.