Moq چیست؟
محبوبترین کتابخانه Mocking در داتنت برای ساخت پیادهسازیهای جعلی از Interfaceها در Unit Testها.
چرا مهم است؟
برای تستکردن یک کلاس بدون درگیرکردن وابستگیهای واقعیاش (دیتابیس، API بیرونی)، باید بتوان رفتار آن وابستگیها را در قالب Interface شبیهسازی کرد؛ Moq این کار را بدون نوشتن Mock دستی ممکن میکند.
تعریف
Moq کتابخانهای برای ساخت نسخه جعلی (Mock) از یک Interface یا کلاس Virtual است؛ به آن میگویید فلان متد با فلان ورودی چه چیزی برگرداند و بعد بررسی میکنید آیا با آن Mock درست تعامل شده یا نه.
مثال
public class OrderServiceTests
{
[Fact]
public async Task PlaceOrder_SendsConfirmationEmail()
{
var emailSenderMock = new Mock<IEmailSender>();
emailSenderMock
.Setup(s => s.SendAsync(It.IsAny<string>(), It.IsAny<string>()))
.ReturnsAsync(true);
var service = new OrderService(emailSenderMock.Object);
await service.PlaceOrderAsync(new Order());
emailSenderMock.Verify(
s => s.SendAsync(It.IsAny<string>(), It.IsAny<string>()),
Times.Once);
}
}
Setup در برابر Verify
Setup مشخص میکند وقتی متد Mock صدا زده شد چه چیزی برگرداند؛ Verify بعد از اجرای کد بررسی میکند آیا متد Mock واقعاً (و با چه تعداد) صدا زده شده است.
اشتباه رایج
❌ Mock کردن کلاسی که خودِ سیستم تحت تست است، نه یک وابستگی بیرونی — باعث میشود تست هیچچیز واقعی را نسنجد و فقط رفتار از پیشتعیینشده را تکرار کند.
منبع و مطالعه بیشتر
خلاصه
Moq وابستگیهای Interface یک کلاس را جعل میکند تا Unit Test بدون دیتابیس/API واقعی اجرا شود. Setup مشخص میکند Mock چه برگرداند و Verify بررسی میکند آیا صدا زده شده. فقط وابستگیهای بیرونی را Mock کنید، نه خودِ سیستم تحت تست. مرجع کامل: مستندات رسمی Moq روی گیتهاب.
