این Mock یا Mocking چیه؟!!

 این Mock یا Mocking چیه؟!!
این Mock یا Mocking چیه؟!!

در واقع Mock کردن (Mocking) یک تکنیک تست نویسی است که در آن قسمتی از کد را با یک پیاده سازی دلخواه جایگزین میکنیم و از آن برای شبیه سازی یک عملیات واقعی استفاده میشه.

معمولا ماک کردن زمانی استفاده میشه که یک متد یا کلاس، وابستگی یا وابستگی هایی داره که توی تستمون تداخل ایجاد میکنه.


مثلا فرض کنید یک سرویسی رو میخواین تست کنین که داخلش از سرویس SmsSender استفاده شده (یعنی به سرویس SmsSender وابستگی داره)، درنتیجه هربار که اون تست رو انجام میدید یه SMS هم ارسال میکنه که خب لازم نیست

در این صورت میایم و سرویس SmsSender رو ماک میکنیم که دیگه Sms ارسال نکنه ولی true رو برگردونه (به این معنی که درست کار کرده)


این باعث میشه ما بتونیم عملکرد (functionality) همون متد رو تست کنیم به جای اینکه تست مون را درگیر و وابسته به عوامل ثالث (مثل ارسال SMS) کنیم


حالا چه وقتایی معمولا ماک استفاده میشه؟


1️⃣ وابستگی ما در دسترس نباشه

مثلا سرویس شما قراره یه اطلاعاتی رو از وب سرویس بخونه، خب اگه اینترنت قط باشه، تا بالاترن سطح سرویس هامون که به این وابسته بوده fail میشه، پس میایم ماک اش میکنیم و میگیم با فرض اینکه وب سرویس در دسترسه و داره درست اطلاعات رو بر میگردونه، حالا برو ببینم خودت چند مرده حلاجی؟!


2️⃣ وابستگی ما کند باشه

مثلا یه تست برای انجام شدنش نیاز به یه کوئری به دیتابیس داره که 60 ثانیه زمان میبره، پس میایم و ادامه ماجرا ...


3️⃣ وابستگی ما باید توی تست رفتارش عوض بشه

مثل همین مثال سرویس SmsSender


4️⃣ و چندین سناریو دیگه ...


بهترین کتابخانه های Mocking در دات نت این ها هستند


?حالا یه سوالی که پیش میاد اینه که

این کتابخانه های Mocking چطوری کار میکنن؟!

اساس کار این ابزار ها به 2 صورت هست


1️⃣ بر اساس interface :

که عملا توی runtime، یک کلاس الکی درست میکنن که از interface شما ارث بری کرده و بهتون اجازه میده که پیاده سازی متد هاش رو تغییر بدین


2️⃣ بر اساس virtual و abstract بودن متد ها :

در این روش متد هایی که میخواین قابل mock شدن باشن باید virtual یا abstract تعریف بشن (و البته کلاس مورد نظر sealed یا static نباشه)، در این صورت میاد و توی runtime یک کلاس ایجاد میکنه که از کلاس مورد نظر شما ارث بری کرده ولی متد های virtual اش رو override (بازنویسی) کرده و بهتون اجازه میده که پیاده سازی متد هاش رو تغییر بدین

https://t.me/DotNetZoom