Microsoft Technologies Mocking NHibernate Session এবং Repository Pattern গাইড ও নোট

376

NHibernate-এ টেস্টিং করার সময়, বিশেষ করে ইউনিট টেস্ট (Unit Testing) করার সময়, NHibernate Session এবং Repository Pattern এর জন্য mocking করা খুবই গুরুত্বপূর্ণ। এই পদ্ধতিটি আপনাকে ডেটাবেস-নির্ভর কোডের টেস্টিং করতে সাহায্য করে, যাতে আপনি টেস্ট কেস চালানোর সময় ডেটাবেসে কোনো পরিবর্তন না ঘটান। Mocking এর মাধ্যমে আপনি NHibernate Session এবং Repository ক্লাসের কার্যকারিতা নকল (simulate) করতে পারেন।

এখানে, NHibernate Session এবং Repository Pattern এর জন্য mocking করার কিছু পদ্ধতি দেখানো হলো।


1. Repository Pattern in NHibernate

Repository Pattern একটি সফটওয়্যার ডিজাইন প্যাটার্ন যা ডোমেইন অবজেক্টদের সাথে ডেটাবেস ইন্টারঅ্যাকশন আবস্ট্রাক্ট (abstract) করে। Repository Pattern ব্যবহার করলে কোডে Business Logic এবং Data Access Logic আলাদা রাখা যায়, যার ফলে কোড সহজে রক্ষণাবেক্ষণযোগ্য এবং টেস্ট করা যায়।

1.1 Repository Interface and Implementation:

public interface IEmployeeRepository
{
    Employee GetById(int id);
    void Save(Employee employee);
    void Delete(Employee employee);
    IList<Employee> GetAll();
}

public class EmployeeRepository : IEmployeeRepository
{
    private readonly ISession _session;

    public EmployeeRepository(ISession session)
    {
        _session = session;
    }

    public Employee GetById(int id)
    {
        return _session.Get<Employee>(id);
    }

    public void Save(Employee employee)
    {
        using (ITransaction transaction = _session.BeginTransaction())
        {
            _session.SaveOrUpdate(employee);
            transaction.Commit();
        }
    }

    public void Delete(Employee employee)
    {
        using (ITransaction transaction = _session.BeginTransaction())
        {
            _session.Delete(employee);
            transaction.Commit();
        }
    }

    public IList<Employee> GetAll()
    {
        return _session.Query<Employee>().ToList();
    }
}

এখানে, EmployeeRepository একটি বাস্তব ক্লাস, যা NHibernate Session ব্যবহার করে ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করে।


2. Mocking NHibernate Session

Mocking মূলত Test Doubles তৈরির একটি পদ্ধতি, যার মাধ্যমে আপনি এমন অবজেক্ট তৈরি করেন যেগুলো আসল অবজেক্টের কার্যকারিতা নকল (simulate) করে। NHibernate Session mocking এর জন্য, সাধারণত আমরা Moq বা অন্য কোনো mocking লাইব্রেরি ব্যবহার করি।

2.1 Moq লাইব্রেরি দিয়ে NHibernate Session Mocking:

Moq একটি জনপ্রিয় mocking লাইব্রেরি যা C#-এ টেস্টিং এর জন্য ব্যবহৃত হয়। এখানে আমরা দেখবো কিভাবে ISession এবং ITransaction কে mock করা যায়।

using Moq;
using NHibernate;
using NUnit.Framework;

[TestFixture]
public class EmployeeRepositoryTests
{
    private Mock<ISession> _mockSession;
    private Mock<ITransaction> _mockTransaction;
    private IEmployeeRepository _employeeRepository;

    [SetUp]
    public void Setup()
    {
        _mockSession = new Mock<ISession>();
        _mockTransaction = new Mock<ITransaction>();
        
        // Mocking the Get method of ISession
        _mockSession.Setup(s => s.Get<Employee>(It.IsAny<int>())).Returns(new Employee { Id = 1, Name = "John Doe" });

        // Mocking transaction to ensure commit works
        _mockSession.Setup(s => s.BeginTransaction()).Returns(_mockTransaction.Object);

        _employeeRepository = new EmployeeRepository(_mockSession.Object);
    }

    [Test]
    public void GetById_ShouldReturnEmployee_WhenEmployeeExists()
    {
        var employee = _employeeRepository.GetById(1);
        
        Assert.IsNotNull(employee);
        Assert.AreEqual("John Doe", employee.Name);
    }

    [Test]
    public void Save_ShouldCommitTransaction_WhenSavingEmployee()
    {
        var employee = new Employee { Id = 2, Name = "Jane Doe" };

        _employeeRepository.Save(employee);
        
        _mockSession.Verify(s => s.SaveOrUpdate(It.IsAny<Employee>()), Times.Once);
        _mockTransaction.Verify(t => t.Commit(), Times.Once);
    }
}

এখানে:

  • Moq লাইব্রেরি ব্যবহার করে আমরা ISession এবং ITransaction এর মক অবজেক্ট তৈরি করেছি।
  • Setup মেথডের মাধ্যমে Get মেথডটি একটি Employee অবজেক্ট রিটার্ন করার জন্য কনফিগার করেছি।
  • Save মেথডের জন্য একটি টেস্ট তৈরি করেছি যেখানে আমরা চেক করেছি যে SaveOrUpdate এবং Commit মেথডগুলো ঠিকমতো কল হয়েছে।

3. Mocking NHibernate Session and Repository Using In-Memory Database

এছাড়া, আপনি In-Memory Database ব্যবহার করে বাস্তব ডেটাবেস ছাড়া NHibernate-এর কার্যকারিতা টেস্ট করতে পারেন। এটি আপনার টেস্টগুলোকে ডেটাবেস থেকে বিচ্ছিন্ন রাখে এবং দ্রুত টেস্ট চালানোর সুবিধা দেয়। যেমন, SQLite বা H2 ইন-মেমরি ডেটাবেস ব্যবহার করা যেতে পারে।

3.1 In-Memory Database Configuration (Example with SQLite):

var configuration = new Configuration();
configuration.Configure();  // NHibernate config from hibernate.cfg.xml
configuration.AddAssembly(Assembly.GetExecutingAssembly()); // Add mappings

// Use SQLite In-Memory DB
configuration.SetProperty(NHibernate.Cfg.Environment.ConnectionString, "Data Source=:memory:;Version=3;New=True;");
configuration.SetProperty(NHibernate.Cfg.Environment.Dialect, "NHibernate.Dialect.SQLiteDialect");

var sessionFactory = configuration.BuildSessionFactory();
using (var session = sessionFactory.OpenSession())
{
    var repository = new EmployeeRepository(session);
    
    // Your test logic here
}

এখানে, আমরা SQLite ব্যবহার করে ইন-মেমরি ডেটাবেস সেটআপ করেছি এবং NHibernate-এর কার্যকারিতা টেস্ট করছি।


4. Conclusion

Mocking NHibernate Session এবং Repository Pattern ব্যবহার করে টেস্টিং করার পদ্ধতি অনেক সুবিধাজনক। এতে আপনি ডেটাবেস ইন্টারঅ্যাকশন ছাড়াই Business Logic টেস্ট করতে পারেন এবং ডেটাবেসে কোনো পরিবর্তন না করেই আপনার কোডের কার্যকারিতা যাচাই করতে পারবেন। Moq লাইব্রেরি ব্যবহার করে আপনি সহজেই ISession এবং ITransaction মক করতে পারেন, এবং ইন-মেমরি ডেটাবেস ব্যবহার করে বাস্তব ডেটাবেস ছাড়া টেস্ট চালাতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...