Unit Testing হল সফটওয়্যার ডেভেলপমেন্টের একটি গুরুত্বপূর্ণ অংশ, যেখানে কোডের নির্দিষ্ট অংশ (ফাংশন বা মেথড) আলাদাভাবে পরীক্ষা করা হয়। Unit Test এর মাধ্যমে আমরা কোডের কার্যকারিতা নিশ্চিত করতে পারি। Mocking Framework যেমন Moq ব্যবহার করে, আপনি বিভিন্ন ডিপেনডেন্সি এবং সিস্টেমের বাহ্যিক উপাদানগুলিকে "মক" করতে পারেন, যার মাধ্যমে একটি নির্দিষ্ট কোডের অংশ পরীক্ষা করা যায়, যদিও তার বাহ্যিক ডিপেনডেন্সি থাকে না।
Moq হল একটি জনপ্রিয় .NET mocking লাইব্রেরি যা Unit Testing-এ খুবই সহায়ক। এটি আপনার মক অবজেক্ট তৈরি করতে সাহায্য করে, যা আপনার কোডের নির্দিষ্ট অংশের আচরণ পরীক্ষার জন্য ব্যবহৃত হয়।
Moq লাইব্রেরি ব্যবহার করে, আপনি মক অবজেক্ট তৈরি করতে পারেন যা আপনার টেস্টের জন্য নির্দিষ্ট আচরণ প্রদান করবে। এটি ডিপেনডেন্সি ইনজেকশন (DI) বা অন্য বাহ্যিক সিস্টেমের সাথে নির্ভরশীল কোডের টেস্টিং সহজ করে তোলে।
প্রথমে, Moq লাইব্রেরি আপনার প্রোজেক্টে যোগ করতে হবে। যদি আপনি NuGet ব্যবহার করেন, তবে এটি আপনার প্যাকেজ ম্যানেজার কনসোল থেকে ইনস্টল করা যাবে:
Install-Package Moq
আপনি .NET CLI ব্যবহার করেও এটি ইনস্টল করতে পারেন:
dotnet add package Moq
ধরা যাক, আপনার একটি IOrderService ইন্টারফেস রয়েছে, যা একটি ProcessOrder মেথড রাখে। এখন, আমরা একটি OrderProcessor ক্লাস তৈরি করব, যা IOrderService ব্যবহার করে।
public interface IOrderService
{
bool ProcessOrder(Order order);
}
public class OrderProcessor
{
private readonly IOrderService _orderService;
public OrderProcessor(IOrderService orderService)
{
_orderService = orderService;
}
public bool ProcessOrder(Order order)
{
if (order == null || !order.IsValid)
{
return false;
}
return _orderService.ProcessOrder(order);
}
}
এখানে, OrderProcessor ক্লাসটি IOrderService ইন্টারফেসের উপর নির্ভরশীল। এর মাধ্যমে আমরা মক অবজেক্ট তৈরি করতে পারব এবং তার সাথে টেস্ট চালাতে পারব।
public class Order
{
public bool IsValid { get; set; }
}
এখন, আমরা OrderProcessor ক্লাসের জন্য একটি Unit Test লিখব যেখানে IOrderService মক করা হবে।
Moq ব্যবহার করে, আমরা IOrderService মক করব এবং OrderProcessor টেস্ট করব।
using Moq;
using Xunit;
public class OrderProcessorTests
{
[Fact]
public void ProcessOrder_ShouldReturnFalse_WhenOrderIsNull()
{
// Arrange
var mockOrderService = new Mock<IOrderService>();
var orderProcessor = new OrderProcessor(mockOrderService.Object);
// Act
var result = orderProcessor.ProcessOrder(null);
// Assert
Assert.False(result);
}
[Fact]
public void ProcessOrder_ShouldReturnFalse_WhenOrderIsInvalid()
{
// Arrange
var mockOrderService = new Mock<IOrderService>();
var orderProcessor = new OrderProcessor(mockOrderService.Object);
var invalidOrder = new Order { IsValid = false };
// Act
var result = orderProcessor.ProcessOrder(invalidOrder);
// Assert
Assert.False(result);
}
[Fact]
public void ProcessOrder_ShouldReturnTrue_WhenOrderIsValid()
{
// Arrange
var mockOrderService = new Mock<IOrderService>();
mockOrderService.Setup(service => service.ProcessOrder(It.IsAny<Order>())).Returns(true);
var orderProcessor = new OrderProcessor(mockOrderService.Object);
var validOrder = new Order { IsValid = true };
// Act
var result = orderProcessor.ProcessOrder(validOrder);
// Assert
Assert.True(result);
}
}
এখানে, আমরা তিনটি টেস্ট কেস লিখেছি:
IsValid
ফিল্ড false) হয়, তবে ফলাফল false হবে।mockOrderService.Setup()
-এর মাধ্যমে আমরা মক অবজেক্টের প্রত্যাশিত আচরণ নির্ধারণ করি।Moq দিয়ে আপনি Exception এর টেস্টও করতে পারেন, যেমন যদি মক অবজেক্টটি একটি নির্দিষ্ট ধরনের এক্সসেপশন ফেলে:
[Fact]
public void ProcessOrder_ShouldThrowException_WhenServiceFails()
{
// Arrange
var mockOrderService = new Mock<IOrderService>();
mockOrderService.Setup(service => service.ProcessOrder(It.IsAny<Order>()))
.Throws(new InvalidOperationException("Service failed"));
var orderProcessor = new OrderProcessor(mockOrderService.Object);
var validOrder = new Order { IsValid = true };
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => orderProcessor.ProcessOrder(validOrder));
Assert.Equal("Service failed", exception.Message);
}
এখানে, mockOrderService.Setup() ব্যবহার করে আমরা ইচ্ছাকৃতভাবে InvalidOperationException ফেলে দিয়েছি, এবং Assert.Throws() ব্যবহার করে আমরা এক্সসেপশনটি পরীক্ষা করছি।
Moq ব্যবহার করে Unit Testing-এ মক অবজেক্ট তৈরি এবং পরিচালনা করা খুবই কার্যকর। এটি আপনার কোডের নির্দিষ্ট অংশ পরীক্ষা করতে সাহায্য করে, ডিপেনডেন্সি ইনজেকশন এবং বাহ্যিক সিস্টেমের উপস্থিতি ছাড়াই। Moq টেস্টিংকে আরও সহজ, সাশ্রয়ী এবং কার্যকরী করে তোলে।
common.read_more