TDD و مسخره – جامعه dev

در آخرین پست ما در مورد اصول اصلی آزمایش واحد و TDD بحث کرده ایم. در این پست ، ما یک مثال ساده از نحوه استفاده را طی خواهیم کرد موق به عنوان چارچوب مسخره و تزریق وابستگی با راهبه در زمینه توسعه آزمایش محور (TDD) در C#. این ترکیب با تمسخر وابستگی ها و تمرکز بر رفتار سیستم تحت آزمایش ، آزمایش های تمیز و قابل حفظ را امکان پذیر می کند.
تصور کنید که ما یک برنامه داریم که پرداخت ها را از طریق a پردازش می کنیم PaymentService
بشر این سرویس به یک خارجی بستگی دارد IPaymentGateway
رابط برای پرداخت واقعی.
بیایید این مرحله به مرحله را کنار بگذاریم.
مرحله 1: ابتدا آزمون را بنویسید (قبل از کد)
ما می خواهیم آزمایش کنیم PaymentService
، که بستگی به آن دارد IPaymentGateway
بشر اولین آزمون ما بر اطمینان از اطمینان خواهد بود PaymentService
هنگام انجام پرداخت معتبر ، به درستی رفتار می کند.
در اینجا کد آزمون وجود دارد:
using Moq;
using NUnit.Framework;
[TestFixture]
public class PaymentServiceTests
{
private Mock<IPaymentGateway> _mockPaymentGateway;
private PaymentService _paymentService;
[SetUp]
public void Setup()
{
// Create the mock object
_mockPaymentGateway = new Mock<IPaymentGateway>();
// Inject the mock into the PaymentService
_paymentService = new PaymentService(_mockPaymentGateway.Object);
}
[Test]
public void MakePayment_WhenAmountIsValid_ShouldReturnTrue()
{
// Arrange
var amount = 100m; // Valid amount
_mockPaymentGateway.Setup(gateway => gateway.ProcessPayment(amount)).Returns(true);
// Act
var result = _paymentService.MakePayment(amount);
// Assert
Assert.IsTrue(result);
}
}
مرحله 2: آزمون را اجرا کنید (شکست خواهد خورد)
از آنجا که ما اجرا نکرده ایم PaymentService
یا IPaymentGateway
با این حال ، اجرای آزمون منجر به خرابی خواهد شد. پیام خطا نشان می دهد که PaymentService
وت IPaymentGateway
هنوز وجود ندارد
اکنون باید حداقل کد را پیاده سازی کنیم تا این آزمون بگذرد.
مرحله 3: کد را برای گذراندن آزمون بنویسید
ما باید ایجاد کنیم PaymentService
وت IPaymentGateway
رابط به گونه ای که آزمون بتواند با موفقیت اجرا شود.
در اینجا اجرای IPaymentGateway
رابط و PaymentService
کلاس:
public interface IPaymentGateway
{
bool ProcessPayment(decimal amount);
}public class PaymentService
{
private readonly IPaymentGateway _paymentGateway;
public PaymentService(IPaymentGateway paymentGateway)
{
_paymentGateway = paymentGateway;
}
public bool MakePayment(decimal amount)
{
// Business logic for validating amount (e.g., check if it's positive)
if (amount <= 0)
{
return false;
}
// Process the payment through the gateway
return _paymentGateway.ProcessPayment(amount);
}
}
مرحله 4: آزمون را دوباره اجرا کنید (باید بگذرد)
اکنون که ما اجرا کرده ایم PaymentService
وت IPaymentGateway
، ما می توانیم دوباره آزمون را اجرا کنیم.
اگر همه چیز به درستی تنظیم شده باشد ، این بار باید آزمون بگذرد. خروجی باید نشان دهد که MakePayment
روش PaymentService
همانطور که انتظار می رود ، بازگردد true
هنگامی که یک مقدار معتبر منتقل می شود و دروازه باز می گردد true
بشر
مرحله 5: یک آزمون دیگر بنویسید (رویکرد آزمون رشد)
مرحله بعدی در TDD نوشتن تست دیگری برای سناریوی متفاوت است. در این حالت ، هنگامی که مبلغ پرداخت نامعتبر منتقل می شود (به عنوان مثال ، مبلغ منفی یا صفر) آزمایش خواهیم کرد. بیایید این آزمون را بنویسیم.
در اینجا آزمون بعدی است:
[Test]
public void MakePayment_WhenAmountIsInvalid_ShouldReturnFalse()
{
// Arrange
var amount = -50m; // Invalid amount
_mockPaymentGateway.Setup(gateway => gateway.ProcessPayment(It.IsAny<decimal>())).Returns(false);
// Act
var result = _paymentService.MakePayment(amount);
// Assert
Assert.IsFalse(result);
}
مرحله ششم: در صورت لزوم کد را اصلاح کنید
اکنون ، ما یک آزمایش برای مورد نامعتبر داریم و در صورت لزوم باید هرگونه منطق اضافی را اجرا کنیم تا این آزمایش بگذرد. در کد فعلی ما ، منطق از قبل برمی گردد false
اگر مقدار کمتر از یا مساوی باشد 0
بشر این بدان معنی است که کد در حال حاضر صحیح است ، و ما نیازی به تغییر چیزی نداریم.
پایان
این مثال نحوه استفاده از توسعه آزمایش محور در C# را با NUNIT ، MOQ و تزریق وابستگی نشان می دهد. با تمسخر وابستگی ها ، می توانید به راحتی رفتار خدمات خود را بدون تکیه بر پیاده سازی های واقعی آزمایش کنید و آزمایشات خود را سریعتر و قابل اطمینان تر کنید. تزریق وابستگی تضمین می کند که وابستگی ها به راحتی قابل تعویض هستند و کد تمیز و قابل حفظ را ترویج می کنند.