Mocking DbContext এবং DbSet

Microsoft Technologies - এন্টিটি ফ্রেমওয়র্ক (Entity Framework) Entity Framework এবং Unit Testing |
190
190

Mocking হল এক ধরনের টেস্টিং কৌশল, যেখানে আপনি মূল কনটেক্সট (যেমন DbContext বা DbSet) এর একটি নকল বা মক ভার্সন তৈরি করেন, যাতে আপনি যেকোনো ডেটাবেস অপারেশন ছাড়া আপনার কোডের কার্যকারিতা পরীক্ষা করতে পারেন। যখন আপনি Unit Testing করতে চান এবং ডেটাবেসের সাথে সরাসরি যোগাযোগ না করে শুধু লজিক পরীক্ষা করতে চান, তখন Mocking DbContext এবং DbSet ব্যবহার করা হয়।


Mocking কী এবং কেন এটি ব্যবহার করা হয়?

Mocking সাধারণভাবে টেস্টিংয়ে ব্যবহৃত একটি পদ্ধতি, যেখানে আপনি কোনো নির্দিষ্ট ডিপেনডেন্সির কাজের বদলে তার একটি কাল্পনিক বা মক ভার্সন তৈরি করেন। এর ফলে, আপনি ডেটাবেসের পরিবর্তে মক ডেটা ব্যবহার করে কোডের বিভিন্ন অংশের কার্যকারিতা পরীক্ষা করতে পারেন।

DbContext এবং DbSet মক করার মাধ্যমে আপনি ডেটাবেসের সত্যিকারের কাজ থেকে মুক্তি পেয়ে, শুধুমাত্র লজিক্যাল পার্টটিকে টেস্ট করতে পারেন। এটি বিশেষত তখন গুরুত্বপূর্ণ, যখন আপনার প্রকল্পে Unit Testing প্রয়োজন এবং আপনি ডেটাবেসে কোনো পরিবর্তন বা যোগ/বিয়োগ না করতে চান।


Mocking DbContext এবং DbSet কিভাবে করবেন?

1. Mocking DbContext:

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 মেথডের কার্যকারিতা পরীক্ষা করতে পারেন। আপনি মূল ডেটাবেসে কোনো ডেটা পরিবর্তন না করে শুধুমাত্র মক ডেটা ব্যবহার করে টেস্ট করেছেন।


2. Mocking DbSet:

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 মেথড সঠিকভাবে কাজ করছে।


Mocking DbContext এবং DbSet এর সুবিধা

  1. Unit Testing: মক ডেটাবেস ব্যবহার করার মাধ্যমে আপনি সরাসরি ডেটাবেসের উপর কোন পরিবর্তন না করে কোডের লজিক পরীক্ষা করতে পারেন।
  2. ফাস্ট টেস্টিং: ডেটাবেসের সাথে কাজ না করার ফলে টেস্টগুলি দ্রুত চলে এবং আপনি দ্রুত ফলাফল পেতে পারেন।
  3. কনট্রোলড টেস্ট: ডেটাবেসের অবস্থা নিয়ন্ত্রণ করতে পারবেন, যেমন মক ডেটা তৈরি করে টেস্ট করার জন্য।
  4. নেটওয়ার্ক ডিপেনডেন্সি হ্রাস: ডেটাবেস কনফিগারেশন বা নেটওয়ার্ক সমস্যা ছাড়াই কোড টেস্ট করা সম্ভব।

কিছু টিপস

  • Moq লাইব্রেরি ব্যবহার করুন: Moq লাইব্রেরি ডটনেটের মকিং টুলগুলোর মধ্যে অন্যতম, যা সহজেই DbContext এবং DbSet মক করতে সাহায্য করে।
  • সঠিক মক ডেটা ব্যবহার করুন: আপনার টেস্টের ক্ষেত্রে ডেটা মকিং সঠিকভাবে করতে হবে যাতে আপনি বাস্তবিক ফলাফল পেতে পারেন।
  • Verify মেথড ব্যবহার করুন: মক অবজেক্টে মেথড কল ঠিকভাবে হয়েছে কিনা, তা নিশ্চিত করার জন্য Verify মেথড ব্যবহার করুন।

Mocking DbContext এবং DbSet এর মাধ্যমে আপনি শুধুমাত্র কোডের লজিক এবং ব্যবসায়িক কার্যকারিতা পরীক্ষা করতে পারবেন, যা ডেটাবেসের সাথে সরাসরি কাজ না করেও নিশ্চিত করতে সাহায্য করে যে, আপনার অ্যাপ্লিকেশন ঠিকমতো কাজ করছে।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion