Mocking Framework (Moq) ব্যবহার করে Unit Testing

Microsoft Technologies - এএসপি ডট নেট কোর (ASP.Net Core) Unit Testing এবং Integration Testing |
211
211

Moq হলো .NET অ্যাপ্লিকেশনের জন্য একটি জনপ্রিয় Mocking Framework, যা Unit Testing এর সময় ডিপেনডেন্সি মক করার সুবিধা প্রদান করে। এটি বিশেষভাবে Dependency Injection ভিত্তিক অ্যাপ্লিকেশনের জন্য কার্যকর। Moq Framework ব্যবহার করে, আপনি ডিপেনডেন্ট অবজেক্টের মক (Mock) তৈরি করতে পারেন এবং তাদের আচরণ নিয়ন্ত্রণ করতে পারেন।

Unit Testing-এ মকিং ব্যবহারের মাধ্যমে আপনি External Dependencies (যেমন ডাটাবেস, API, বা সার্ভিস) সরিয়ে ফেলে শুধুমাত্র টেস্ট করা ক্লাসের কার্যকলাপ নিশ্চিত করতে পারেন।


Moq Framework এর গুরুত্ব

  1. ডিপেনডেন্সি রিমুভ করা: Moq ব্যবহার করে আপনি ডিপেনডেন্ট ক্লাস বা ইন্টারফেস মক করতে পারেন।
  2. সিমুলেটেড ডেটা: টেস্টিংয়ের জন্য সিমুলেটেড ডেটা সরবরাহ করা যায়।
  3. ডিটারমিনিস্টিক টেস্টিং: নির্দিষ্ট আউটপুট নিশ্চিত করতে কাস্টম সিমুলেশন তৈরি করা যায়।
  4. টেস্টের গতি বৃদ্ধি: ডাটাবেস বা API এর মতো এক্সটার্নাল সার্ভিসে নির্ভর না করে টেস্ট দ্রুততর হয়।

Moq ইনস্টল করা

Moq Framework ব্যবহার করার জন্য NuGet Package Manager বা dotnet CLI ব্যবহার করে প্যাকেজ ইন্সটল করতে পারেন:

NuGet Package Manager:

Visual Studio এর NuGet Package Manager থেকে Moq ইনস্টল করুন।

dotnet CLI:

dotnet add package Moq

Moq এর সাথে Unit Test লেখার ধাপ

১. ইন্টারফেস তৈরি করুন

Moq সাধারণত ইন্টারফেসের উপর কাজ করে, কারণ মক করার জন্য এটি ডিপেনডেন্সি ইনজেকশন ব্যবহার করে।

উদাহরণস্বরূপ, একটি IUserRepository ইন্টারফেস যেখানে ডেটাবেস অপারেশন থাকে:

public interface IUserRepository
{
    User GetUserById(int id);
    void AddUser(User user);
}

২. ক্লাস তৈরি করুন যা ইন্টারফেস ব্যবহার করে

UserService ক্লাস, যেখানে IUserRepository এর উপর নির্ভরশীলতা রয়েছে:

public class UserService
{
    private readonly IUserRepository _userRepository;

    public UserService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public string GetUserNameById(int id)
    {
        var user = _userRepository.GetUserById(id);
        return user != null ? user.Name : "User not found";
    }
}

৩. Unit Test তৈরি করুন

UserService ক্লাসের জন্য Unit Test লিখতে হবে। এখানে আমরা Moq ব্যবহার করে IUserRepository মক করব।

টেস্ট ফাইল:
using Moq;
using Xunit;

public class UserServiceTests
{
    [Fact]
    public void GetUserNameById_UserExists_ReturnsUserName()
    {
        // Arrange
        var mockUserRepository = new Mock<IUserRepository>();
        mockUserRepository.Setup(repo => repo.GetUserById(1))
                          .Returns(new User { Id = 1, Name = "John Doe" });

        var userService = new UserService(mockUserRepository.Object);

        // Act
        var result = userService.GetUserNameById(1);

        // Assert
        Assert.Equal("John Doe", result);
    }

    [Fact]
    public void GetUserNameById_UserDoesNotExist_ReturnsUserNotFound()
    {
        // Arrange
        var mockUserRepository = new Mock<IUserRepository>();
        mockUserRepository.Setup(repo => repo.GetUserById(2))
                          .Returns((User)null);

        var userService = new UserService(mockUserRepository.Object);

        // Act
        var result = userService.GetUserNameById(2);

        // Assert
        Assert.Equal("User not found", result);
    }
}

কোড বিশ্লেষণ

Mock Object তৈরি করা

var mockUserRepository = new Mock<IUserRepository>();

Moq ব্যবহার করে IUserRepository এর একটি মক ইন্সট্যান্স তৈরি করা হয়েছে।

মক সেটআপ করা

mockUserRepository.Setup(repo => repo.GetUserById(1))
                  .Returns(new User { Id = 1, Name = "John Doe" });

GetUserById(1) মেথডটি কল হলে এটি একটি নির্দিষ্ট মান User ফেরত দেবে।

মক অবজেক্ট পাস করা

var userService = new UserService(mockUserRepository.Object);

মক করা অবজেক্ট userService এর কনস্ট্রাক্টরে পাস করা হয়েছে।

অ্যাসার্ট করা

Assert.Equal("John Doe", result);

পরীক্ষা করা হচ্ছে যে GetUserNameById(1) মেথডটি সঠিক ফলাফল ফেরত দিচ্ছে কিনা।


Moq-এর উন্নত বৈশিষ্ট্য

ভেরিফিকেশন

Moq দিয়ে নিশ্চিত করা যায় যে একটি নির্দিষ্ট মেথড নির্দিষ্ট সংখ্যক বার কল করা হয়েছে কিনা।

mockUserRepository.Verify(repo => repo.GetUserById(1), Times.Once);

এটি নিশ্চিত করবে যে GetUserById(1) শুধুমাত্র একবার কল হয়েছে।

Exception নিক্ষেপ

মক মেথড একটি নির্দিষ্ট Exception ছুঁড়তে পারে:

mockUserRepository.Setup(repo => repo.AddUser(It.IsAny<User>()))
                  .Throws(new Exception("Database error"));

Moq ব্যবহার করার সুবিধা

  1. External Dependency রিমুভ করা: ডাটাবেস, API, বা অন্য কোনো এক্সটার্নাল সিস্টেমের প্রয়োজন নেই।
  2. ফাস্ট এবং নির্ভরযোগ্য টেস্টিং: মকিং ব্যবহারের মাধ্যমে টেস্ট দ্রুত রান করে এবং নির্ভুল ফলাফল দেয়।
  3. ফ্লেক্সিবল সিমুলেশন: বিভিন্ন টেস্ট কেস তৈরি করার জন্য Moq অত্যন্ত ফ্লেক্সিবল।

সারসংক্ষেপ

Moq Framework ব্যবহার করে ASP.NET Core অ্যাপ্লিকেশনের Unit Testing সহজ এবং কার্যকর হয়। এটি ডিপেনডেন্ট ক্লাস বা ইন্টারফেসের মক তৈরি করে টেস্টিং-এর সময় এক্সটার্নাল ডিপেনডেন্সি দূর করে। এর ফলে কোডের গুণগত মান বৃদ্ধি পায় এবং টেস্টিং দ্রুত এবং নির্ভরযোগ্য হয়। Moq Framework Unit Testing-এর জন্য একটি অত্যন্ত কার্যকর টুল।

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

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

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

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