CodeShot

Mock (تأیید رفتار) در مقابل Stub (پاسخ ثابت)

در Moq، وقتی از Verify() برای اطمینان از فراخوانی یک متد با آرگومان‌های خاص استفاده می‌کنید، شیء را به‌عنوان Mock به‌کار برده‌اید که رفتار (تعامل) را تست می‌کند؛ وقتی فقط از Setup() برای بازگرداندن یک مقدار ثابت بدون Verify کردن فراخوانی استفاده می‌کنید، همان شیء نقش Stub یعنی تأمین‌کننده داده ساختگی را دارد.

ویژگیMock (تأیید رفتار)Stub (پاسخ ثابت)
هدفتأیید فراخوانی (رفتار)تأمین داده ثابت (حالت)
استفاده از Verify()بلهخیر
حساسیت به Refactorبیشترکمتر

کِی از Mock (تأیید رفتار) استفاده کنیم؟

وقتی مهم است که مطمئن شوید یک متد وابستگی دقیقاً با پارامترهای درست و به تعداد معین فراخوانی شده است (تست رفتار).

کِی از Stub (پاسخ ثابت) استفاده کنیم؟

وقتی فقط نیاز دارید یک وابستگی مقدار مشخصی برگرداند تا بتوانید کد اصلی را تست کنید، بدون اهمیت به این‌که چطور یا چند بار فراخوانی شده.

مثال Mock (تأیید رفتار)

var repo = new Mock<IUserRepository>();
service.Save(user);
repo.Verify(r => r.Add(user), Times.Once);
// اینجا به‌عنوان Mock استفاده شده: رفتار چک می‌شود

مثال Stub (پاسخ ثابت)

var repo = new Mock<IUserRepository>();
repo.Setup(r => r.GetById(1)).Returns(new User());
var result = service.GetUser(1);
// اینجا به‌عنوان Stub استفاده شده: فقط داده برمی‌گرداند

اشتباه رایج

اشتباه رایج Verify کردن بیش از حد و روی جزئیات پیاده‌سازی داخلی است؛ این کار تست‌ها را به هر Refactor کوچک شکننده می‌کند، در حالی که اگر فقط رفتار نهایی (خروجی) مهم است بهتر است شیء را صرفاً Stub کنید نه Mock با Verify.

جمع‌بندی

وقتی صحت فراخوانی یک وابستگی مهم است از Mock با Verify و وقتی فقط به داده ورودی برای تست منطق دیگر نیاز دارید از Stub (Setup بدون Verify) استفاده کنید.