Mocking হল এক ধরনের টেস্টিং কৌশল, যেখানে আপনি মূল কনটেক্সট (যেমন DbContext
বা DbSet
) এর একটি নকল বা মক ভার্সন তৈরি করেন, যাতে আপনি যেকোনো ডেটাবেস অপারেশন ছাড়া আপনার কোডের কার্যকারিতা পরীক্ষা করতে পারেন। যখন আপনি Unit Testing করতে চান এবং ডেটাবেসের সাথে সরাসরি যোগাযোগ না করে শুধু লজিক পরীক্ষা করতে চান, তখন Mocking DbContext এবং DbSet ব্যবহার করা হয়।
Mocking সাধারণভাবে টেস্টিংয়ে ব্যবহৃত একটি পদ্ধতি, যেখানে আপনি কোনো নির্দিষ্ট ডিপেনডেন্সির কাজের বদলে তার একটি কাল্পনিক বা মক ভার্সন তৈরি করেন। এর ফলে, আপনি ডেটাবেসের পরিবর্তে মক ডেটা ব্যবহার করে কোডের বিভিন্ন অংশের কার্যকারিতা পরীক্ষা করতে পারেন।
DbContext এবং DbSet মক করার মাধ্যমে আপনি ডেটাবেসের সত্যিকারের কাজ থেকে মুক্তি পেয়ে, শুধুমাত্র লজিক্যাল পার্টটিকে টেস্ট করতে পারেন। এটি বিশেষত তখন গুরুত্বপূর্ণ, যখন আপনার প্রকল্পে Unit Testing প্রয়োজন এবং আপনি ডেটাবেসে কোনো পরিবর্তন বা যোগ/বিয়োগ না করতে চান।
DbContext
হল EF-এর মূল ক্লাস, যা ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহৃত হয়। টেস্টিংয়ের জন্য, আপনাকে DbContext
এর একটি মক ভার্সন তৈরি করতে হবে, যাতে আপনি ডেটাবেসের অনুলিপি ছাড়াই কোডের কার্যকারিতা পরীক্ষা করতে পারেন।
এটি করার জন্য, আপনি সাধারণত Moq লাইব্রেরি ব্যবহার করবেন। Moq হল একটি জনপ্রিয় .NET লাইব্রেরি যা মক অবজেক্ট তৈরি করার জন্য ব্যবহৃত হয়।
using Moq;
using Microsoft.EntityFrameworkCore;
using System.Linq;
using System.Collections.Generic;
public class MyServiceTests
{
[Fact]
public void TestGetAllEmployees()
{
// Sample data to return from mock DbSet
var data = new List<Employee>
{
new Employee { Id = 1, Name = "John Doe", Age = 30 },
new Employee { Id = 2, Name = "Jane Smith", Age = 25 }
}.AsQueryable();
// Mock DbSet
var mockSet = new Mock<DbSet<Employee>>();
mockSet.As<IQueryable<Employee>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Employee>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Employee>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Employee>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
// Mock DbContext
var mockContext = new Mock<MyDbContext>();
mockContext.Setup(c => c.Employees).Returns(mockSet.Object);
var service = new MyService(mockContext.Object);
// Test the service method
var employees = service.GetAllEmployees();
// Assert the results
Assert.Equal(2, employees.Count());
Assert.Equal("John Doe", employees.First().Name);
}
}
এখানে, DbContext
এবং DbSet
কে মক করা হয়েছে, যাতে আপনি GetAllEmployees
মেথডের কার্যকারিতা পরীক্ষা করতে পারেন। আপনি মূল ডেটাবেসে কোনো ডেটা পরিবর্তন না করে শুধুমাত্র মক ডেটা ব্যবহার করে টেস্ট করেছেন।
DbSet
হল Entity Framework এর সাথে সম্পর্কিত এক ধরনের অ্যাবস্ট্রাকশন, যা আপনাকে ডেটাবেস টেবিলের সাথে কাজ করতে সহায়তা করে। DbSet
এর মক ভার্সন তৈরি করে, আপনি ডেটাবেসে কোনো পরিবর্তন ছাড়াই মডেল অবজেক্টের সাথে কাজ করতে পারবেন।
আপনি মক DbSet
তৈরি করতে LINQ এর পদ্ধতিগুলি ব্যবহার করতে পারেন:
using Moq;
using Microsoft.EntityFrameworkCore;
using System.Linq;
public class MyServiceTests
{
[Fact]
public void TestAddEmployee()
{
var mockSet = new Mock<DbSet<Employee>>();
// Simulating adding an entity
mockSet.Setup(m => m.Add(It.IsAny<Employee>())).Callback<Employee>((s) => {
// Custom behavior when Add is called
});
var mockContext = new Mock<MyDbContext>();
mockContext.Setup(c => c.Employees).Returns(mockSet.Object);
var service = new MyService(mockContext.Object);
// Create an employee object
var newEmployee = new Employee { Id = 3, Name = "Mark Lee", Age = 40 };
// Call the service method
service.AddEmployee(newEmployee);
// Verify that Add was called on the DbSet
mockSet.Verify(m => m.Add(It.Is<Employee>(e => e.Name == "Mark Lee")), Times.Once);
}
}
এখানে, আমরা মক DbSet
এর Add
মেথডের কার্যকারিতা পরীক্ষা করছি, যাতে নিশ্চিত করতে পারি যে, AddEmployee
মেথড সঠিকভাবে কাজ করছে।
Verify
মেথড ব্যবহার করুন।Mocking DbContext এবং DbSet এর মাধ্যমে আপনি শুধুমাত্র কোডের লজিক এবং ব্যবসায়িক কার্যকারিতা পরীক্ষা করতে পারবেন, যা ডেটাবেসের সাথে সরাসরি কাজ না করেও নিশ্চিত করতে সাহায্য করে যে, আপনার অ্যাপ্লিকেশন ঠিকমতো কাজ করছে।
common.read_more