
آموزش کار با Moq و تست واحد در xUnit
آموزش کار با Moq و تست واحد در xUnit یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته ی آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته آموزشی، استفاده کردن از کتابخانه Moq در کنار xUnit برای انجام Mocking در Unit Testing است که با نام اصلی Mocking with Moq 4 and xUnit از شرکت Pluralsight منتشر شده است.
کتابخانه Moq چیست؟ و استفاده از کتابخانه Moq چه مزیت هایی دارد؟
کتابخانه Moq یک کتابخانه به منظور انجام عملیات Mocking و نوشتن تست های .NET می باشد. استفاده کردن از کتابخانه Moq باعث می شود که شما بتوانید به صورت کامل به expression tree های موجود در Linq دسترسی پیدا کنید و به سادگی از lambda expression ها استفاده نمایید. در این رابطه می توانید از آموزش lambda expression ها در سی شارپ استفاده کنید. استفاده کردن از lambda expression ها و expression tree ها باعث می شود که برنامه نویسی ساده تر شود و علاوه بر این type-safe بودن کد شما تضمین می گردد. استفاده کردن از کتابخانه Moq به منظور Moq کردن در تست های واحد امکان ایجاد عملیات Refactoring را نیز ساده تر می کند. در این رابطه توصیه می کنیم حتماً از آموزش Refactoring در سی شارپ استفاده کنید.
با استفاده از کتابخانه Moq به سادگی می توانید Interface ها و همچنین Class ها را Mock کنید. API مربوط به Moq بسیار ساده است و به راحتی می توانید بدون نیاز به دانش و تجربه قبلی در کار کردن مفاهیم Mocking از آن استفاده کنید یا می بایست از کتابخانه Moq استفاده کنید. این کتابخانه به طور ویژه برای آن دسته از برنامه نویسانی ایجاد شده است که هیچ کتابخانه ای به منظور ایجاد عملیات Mocking استفاده نمی کنند. علاوه بر این برنامه نویسانی که از قبل از یک کتابخانه Mocking استفاده می کنند ولی پیچیدگی های مختلفی را در استفاده کردن از این کتابخانه ها تجربه می کنند می توانند از کتابخانه Moq استفاده کنند. استفاده کردن از کتابخانه Moq شما را از زحمت مربوط به ایجاد کردن Mock های نوشته شده توسط خودتان رها می کند.

یکی دیگر از موضوعاتی که کتابخانه Moq شدیداً از آن اشتفاده می کند قابلیت Linq در زبان برنامه نویسی سی شارپ و ویژوال بیسیک می باشد. در این رابطه توصیه می کنیم که حتماً از آموزش Linq پیشرفته وب سایت پرووید استفاده نمایید. علاوه بر این کتابخانه Moq می تواند شما را در استفاده کردن از سبک کدنویسی تست محور و یا TDD نیز یاری کند. استفاده کردن از کتابخانه Moq یک API ساده، سبک وزن و بسیار تمیز را در اختیار شما قرار می دهد تا بتوانید تمامی نیازمندی های خود در رابطه با انجام عملیات Mocking را به سادگی انجام بدهید. با استفاده از این کتابخانه راه اندازی کردن وابستگی ها و یا Dependency های مربوط به این تست ها بسیار ساده تر شده است. طراحی API مربوط به کتابخانه Moq به شما کمک می کند که بسیاری از عملیات Mock کردن وابستگی ها را به صورت خودکار انجام بدهید.
یکی از موضوعات بسیار مهم در رابطه با کتابخانه Moq این است که زمانی که برای اولین بار توسعه داده شد در مقابل روش Record/Replay و بسیاری از کتابخانه های دیگر از آن استفاده می شد قرار گرفت. همین موضوع باعث شد تا کتابخانه Moq بتواند محبوبیت زیادی کسب کند و این کار ایجاد کردن fixture setup ها و یا حتی Override کردن بخش های مختلفی از برنامه به منظور استفاده شدن در Unit Test ها ساده تر بگردد. کتابخانه Moq به صورت درونی Castle DynamicProxy به منظور انجام عملیات interception برای فعال کردن Mocking استفاده می کند.
تست واحد در C# با استفاده از xUnit
تست واحد یکی از روش های آزمایش نرم افزار است که در آن رفتار یک بخش کوچک از برنامه، مانند یک متد یا کلاس، به صورت مستقل بررسی می شود. در پروژه های دات نت، xUnit یکی از فریم ورک های مورد استفاده برای تعریف و اجرای تست ها است. با نوشتن تست های مشخص می توانید ورودی های مختلف را بررسی کنید، نتایج را با مقدار مورد انتظار مقایسه نمایید و هنگام تغییر کد، مشکلات احتمالی را زودتر شناسایی کنید.
برای اینکه تست ها روی رفتار بخش موردنظر تمرکز داشته باشند، باید وابستگی های آن بخش نیز به درستی مدیریت شوند. اگر یک کلاس برای انجام وظیفه خود به سرویس های دیگر نیاز داشته باشد، اجرای واقعی تمام این سرویس ها ممکن است تست را پیچیده یا وابسته به منابع خارجی کند. ترکیب xUnit با کتابخانه Moq امکان جایگزین کردن برخی وابستگی ها با نمونه های ساختگی را فراهم می کند. در این آموزش با مبانی Mocking آشنا می شوید و یاد می گیرید چگونه از آن در تست واحد برنامه های دات نت استفاده کنید.
مفهوم Mocking و ایزوله کردن تست های واحد
Mocking روشی برای شبیه سازی رفتار وابستگی های یک بخش نرم افزاری در زمان اجرای تست است. برای مثال، اگر یک سرویس به یک رابط برای دریافت اطلاعات وابسته باشد، می توان نمونه ای ساختگی از آن رابط ایجاد کرد تا نتیجه موردنیاز را بدون اتصال به سرویس واقعی برگرداند. این کار به شما اجازه می دهد رفتار کلاس مورد آزمایش را در شرایط کنترل شده بررسی کنید و تأثیر مشکلات شبکه، پایگاه داده یا سایر اجزای خارجی را از تست موردنظر جدا نگه دارید.
ایزوله کردن تست ها به این معنا نیست که تمام وابستگی ها همیشه باید Mock شوند؛ بلکه باید مشخص شود کدام بخش ها نیاز به جایگزین دارند و کدام بخش ها بهتر است به صورت واقعی آزمایش شوند. استفاده بیش از حد از Mocking ممکن است تست هایی ایجاد کند که بیشتر به جزئیات پیاده سازی وابسته اند تا رفتار واقعی برنامه. در این دوره با استفاده از Moq برای پیکربندی رفتار وابستگی ها آشنا می شوید و یاد می گیرید چگونه تست هایی هدفمندتر و قابل کنترل تر طراحی کنید.
پیکربندی Method و Property در Moq
کتابخانه Moq امکاناتی برای تعیین رفتار مورد انتظار متدها و Property های یک شیء ساختگی فراهم می کند. برای مثال، می توان مشخص کرد که فراخوانی یک متد با ورودی معین، نتیجه خاصی برگرداند یا در شرایط مشخص رفتار متفاوتی داشته باشد. این قابلیت به توسعه دهندگان اجازه می دهد سناریوهای مختلف را بدون نیاز به اجرای وابستگی واقعی آزمایش کنند و نتیجه تست را با توجه به رفتار تعریف شده بررسی نمایند.
Property های Mock Object نیز می توانند برای شبیه سازی وضعیت یا داده های موردنیاز در طول تست پیکربندی شوند. علاوه بر تعیین رفتار، می توان بررسی کرد که آیا متد موردنظر با آرگومان های مورد انتظار فراخوانی شده است یا خیر. در این دوره با پیکربندی Method ها و Property ها در Moq و همچنین Behavior Verification آشنا می شوید. این مهارت ها به شما کمک می کنند تعامل میان اجزای نرم افزار را دقیق تر بررسی کنید و تست هایی متناسب با سناریوهای موردنیاز بنویسید.
بررسی فراخوانی ها با Behavior Verification در Moq
در برخی تست ها، بررسی مقدار بازگشتی یک متد برای اطمینان از صحت رفتار کافی نیست. ممکن است لازم باشد تأیید کنید یک وابستگی در زمان مناسب فراخوانی شده، تعداد فراخوانی ها درست بوده یا آرگومان های مورد انتظار به آن ارسال شده اند. Behavior Verification در Moq امکان بررسی چنین تعاملاتی را فراهم می کند و به توسعه دهندگان کمک می کند رفتار کلاس مورد آزمایش را در ارتباط با وابستگی هایش ارزیابی کنند.

برای مثال، در یک سناریو می توان بررسی کرد که هنگام اجرای یک عملیات مشخص، متد موردنیاز روی یک وابستگی فراخوانی شده باشد. این نوع بررسی زمانی مفید است که خود تعامل بخشی از رفتار مورد انتظار سیستم باشد. با این حال، تأیید فراخوانی ها باید با دقت انجام شود تا تست ها بیش از حد به جزئیات داخلی پیاده سازی وابسته نشوند. در این آموزش با قابلیت های Behavior Verification و امکانات بیشتر Moq آشنا می شوید تا بتوانید تست هایی دقیق و در عین حال قابل نگهداری طراحی کنید.
سرفصل مطالب آموزش ویدیویی کار با Moq و تست واحد در xUnit
فصل اول: مقدمه دوره آموزشی
- مقدمه
فصل دوم: شروع به کار با Mocking و کتابخانه Moq
- مقدمه
- بررسی اجمالی Mocking
- چطور از Mock Object ها استفاده کنیم؟
- Unit چیست؟
- بررسی Fake ها، Dummie ها، Stub ها، Mock ها و Test Double ها
- مروری بر Moq
- بررسی عملی کد مربوط به این آموزش
- ایجاد کردن یک پروژه Unit Test
- نوشتن اولین Test ها
- معرفی کردن یک Dependency جدید
- جمع بندی
فصل سوم: پیکربندی Method های Mock شده
- مقدمه
- نصب کردن Moq
- ایجاد کردن و استفاده کردن از یک Mock Object
- پیکربندی کردن Method های Mock Object وReturn Value های آنها
- بررسی Argument Matching در Method های Mock شده
- بررسی کردن Mock های Loose و Strict
- بررسی یک مثال از Mock های Strict
- مقایسه کردن Mock های Strict و Loose
- بررسی Refactor کردن Test ها
- تطابق دادن آرگومان های ref با Moq
- جمع بندی
فصل چهارم: پیکربندی کردن Property های Mock Object ها
- مقدمه
- پیکربندی کردن Property های Mack شده به منظور بازگرداندن یک مقدار مشخص
- بدست آوردن یک Return Value از طریق یک تابع
- Mock کردن خودکار سلسله مراتب Proprty ها
- لحاظ کردن رفتار مقدار پیش فرض برای Mock های Loose
- Mock کردن مقادیر Property ها
- ردیابی تغییرات درون Mock Property ها
- جمع بندی
فصل پنجم: پیاده سازی Behavior Verification Test ها
- مقدمه
- Test کردن مبتنی بر رفتار و Test کردن مبتنی بر State
- بررسی کردن اینکه یک Method کی صدا زده شده است
- اضافه کردن یک Error Message سفارشی
- بررسی کردن اینکه یک Method کی صدا زده نشده است
- بررسی کردن اینکه یک Method به دفعات تکرار مشخصی صدا زده شده است
- بررسی کردن اینکه Getter مربوط به یک Property صدا زده شده است
- بررسی کردن اینکه Setter مربوط به یک Property صدا زده شده است
- جمع بندی
فصل ششم: استفاده کردن از Property های Mocking بیشتر در Moq
- مقدمه
- ایجاد کردن Exception ها از درون Mock Object ها
- ایجاد کردن Event ها از درون Mock Object ها
- برگرداندن نتایج متفاوت برای فراخوانی های ترتیبی
- Check کردن اینکه Method های Mock شده چندین دفعه با مقادیر متفاوت صدا زده شده است
- Mock کردن اعضای Type های Concrete با Partial Mock ها
- Mock کردن اعضای Protected و Virtual
- بهبود دادن قابلیت خوانایی Setup مربوط به Mock ها
- Refactor کردن کلاس های Test
- تطبیق دادن آرگومان های از نوع Generic
- Mock کردن مقادیر بازگشتی Async
- جمع بندی







