Moq क्या है और इसकी आवश्यकता क्यों है?
Moq (उच्चारण: "मॉक") C# (.NET) में mock-ऑब्जेक्ट (नकली ऑब्जेक्ट) बनाने के लिए एक लोकप्रिय लाइब्रेरी है। यह यूनिट टेस्टिंग इकोसिस्टम का हिस्सा है और टेस्ट किए जा रहे कोड को उसकी डिपेंडेंसी से अलग करने के लिए उपयोग की जाती है।
असली एप्लिकेशन में, क्लास अक्सर दूसरे क्लास पर निर्भर होते हैं: डेटाबेस, वेब-सर्विस, फ़ाइल सिस्टम, तीसरे पक्ष के API। यूनिट टेस्ट लिखते समय हम इन बाहरी डिपेंडेंसी को टेस्ट नहीं करना चाहते — हम केवल अपने क्लास के लॉजिक की जांच करना चाहते हैं। Moq हमें "नकली" (mock) ऑब्जेक्ट बनाने की अनुमति देता है जो असली डिपेंडेंसी के व्यवहार की नकल करते हैं, लेकिन पूरी तरह से टेस्ट के नियंत्रण में होते हैं।
Moq के मुख्य उपयोग के मामले:
- टेस्ट को अलग करना: डेटाबेस या बाहरी सर्विस चलाए बिना एक क्लास का परीक्षण करना।
- इंटरैक्शन की जांच: यह सुनिश्चित करना कि कोई मेथड सही आर्गुमेंट के साथ और निश्चित संख्या में कॉल हुआ।
- रिटर्न वैल्यू सेट करना: डिपेंडेंसी को लॉजिक जांचने के लिए आवश्यक डेटा लौटाने पर मजबूर करना।
- एक्सेप्शन का अनुकरण: यह जांचना कि कोड बाहरी सिस्टम से आने वाली त्रुटियों को कैसे संभालता है।
Moq इंटरफेस और क्लास के वर्चुअल मेथड के साथ काम करता है। यह एक महत्वपूर्ण सीमा है: आप किसी स्टैटिक मेथड या नॉन-वर्चुअल मेथड को मॉक नहीं कर सकते।
Moq की स्थापना (इंस्टॉलेशन)
Moq NuGet के माध्यम से वितरित किया जाता है — .NET के लिए पैकेज मैनेजर। इसे कई तरीकों से स्थापित किया जा सकता है:
.NET CLI के माध्यम से (अनुशंसित)
dotnet add package Moq
Package Manager Console के माध्यम से (Visual Studio)
Install-Package Moq
NuGet Package Manager UI के माध्यम से
Visual Studio में: प्रोजेक्ट पर राइट-क्लिक करें → Manage NuGet Packages → "Moq" खोजें → इंस्टॉल करें
आवश्यकताएँ: .NET Framework 4.5+ या .NET Core 2.0+ / .NET 5+
त्वरित शुरुआत: Moq के साथ पहला टेस्ट
मान लीजिए हमारे पास एक रिपॉजिटरी इंटरफेस और एक सर्विस है जो इसका उपयोग करती है:
public interface IUserRepository
{
User GetUserById(int id);
void SaveUser(User user);
}
public class UserService
{
private readonly IUserRepository _repository;
public UserService(IUserRepository repository)
{
_repository = repository;
}
public string GetUserName(int userId)
{
var user = _repository.GetUserById(userId);
return user?.Name ?? "Unknown";
}
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
अब Moq का उपयोग करके एक टेस्ट लिखते हैं:
using Moq;
using Xunit;
public class UserServiceTests
{
[Fact]
public void GetUserName_WhenUserExists_ReturnsUserName()
{
// Arrange
var mockRepo = new Mock<IUserRepository>();
mockRepo.Setup(repo => repo.GetUserById(1))
.Returns(new User { Id = 1, Name = "Alice" });
var service = new UserService(mockRepo.Object);
// Act
var result = service.GetUserName(1);
// Assert
Assert.Equal("Alice", result);
mockRepo.Verify(repo => repo.GetUserById(1), Times.Once);
}
}
उदाहरण का विश्लेषण:
new Mock<IUserRepository>()— इंटरफेस के लिए mock-ऑब्जेक्ट बनाता है।.Setup(...)— व्यवहार सेट करता है:GetUserById(1)कॉल करने पर Alice यूज़र लौटाए।mockRepo.Object— "नकली" ऑब्जेक्ट प्राप्त करता है, जिसे सर्विस में पास किया जाता है।mockRepo.Verify(...)— जांचता है कि मेथड ठीक एक बार कॉल हुआ।
Moq के मुख्य मेथड और फंक्शन
1. Mock<T>.Setup()
क्या करता है: mock-ऑब्जेक्ट के मेथड या प्रॉपर्टी के व्यवहार को सेट करता है। यह निर्धारित करता है कि किसी विशेष सदस्य को कॉल करने पर क्या होना चाहिए।
पुस्तकालय में भी
Swift (iOS/macOS) के लिए HTTP-क्लाइंट: 2024 की शीर्ष लाइब्रेरीज़
Go (Golang) के लिए OAuth क्लाइंट: OAuth 2.0 प्रदाताओं से कनेक्शन
Java में Markdown: लाइब्रेरी, पार्सर और उदाहरण
Elasticsearch C# (.NET) क्लाइंट: NEST और Elastic.Clients.Elasticsearch