परिचय: उन्नत स्तर पर परीक्षण क्यों लिखें?
\nC# में परीक्षण का प्रारंभिक स्तर आमतौर पर सरल Assert.Equal और पृथक यूनिट-टेस्ट तक सीमित होता है। हालांकि, वास्तविक एंटरप्राइज़ प्रोजेक्ट्स में यह पर्याप्त नहीं है। बग अक्सर घटकों के जंक्शन पर उत्पन्न होते हैं — डेटाबेस, बाहरी API के साथ इंटरैक्शन या साइड इफेक्ट वाली जटिल बिज़नेस लॉजिक में।
C# (.NET) में उन्नत परीक्षण — यह परीक्षणों का पिरामिड बनाने की क्षमता है, जहाँ यूनिट-टेस्ट तेज़ और पृथक होते हैं, इंटीग्रेशन टेस्ट वास्तविक इंटरैक्शन की जाँच करते हैं, और E2E टेस्ट उपयोगकर्ता के व्यवहार का अनुकरण करते हैं। इस लेख में हम आधुनिक टूल्स पर चर्चा करेंगे: xUnit, Moq, FluentAssertions, Testcontainers और WebApplicationFactory। आप सीखेंगे कि विश्वसनीय परीक्षण कैसे लिखें जो रिफैक्टरिंग के दौरान नहीं टूटते और कोड में आत्मविश्वास प्रदान करते हैं।
\n\n1. उन्नत यूनिट-टेस्ट: मॉक और स्टब-ऑब्जेक्ट
\nयूनिट-टेस्ट बाहरी निर्भरताओं से पृथक होने चाहिए। उन्नत स्तर पर हम मॉक-ऑब्जेक्ट बनाने के लिए लाइब्रेरीज़ का उपयोग करते हैं, जैसे Moq या NSubstitute।
\n\nमॉक-ऑब्जेक्ट्स की सही सेटिंग
\nमैन्युअल रूप से स्टब बनाने के बजाय, त्वरित सेटिंग के लिए Mock.Of<T>() का उपयोग करें। Moq और FluentAssertions के साथ उदाहरण:
public interface IEmailService\n{\n Task SendAsync(string to, string subject);\n}\n\npublic class NotificationService\n{\n private readonly IEmailService _emailService;\n\n public NotificationService(IEmailService emailService)\n {\n _emailService = emailService;\n }\n\n public async Task NotifyUserAsync(string email)\n {\n await _emailService.SendAsync(email, "Welcome!");\n }\n}\n\n// टेस्ट\n[Fact]\npublic async Task NotifyUserAsync_ShouldSendEmail()\n{\n // Arrange\n var mockEmailService = new Mock<IEmailService>();\n var service = new NotificationService(mockEmailService.Object);\n\n // Act\n await service.NotifyUserAsync("test@example.com");\n\n // Assert\n mockEmailService.Verify(\n x => x.SendAsync("test@example.com", "Welcome!"),\n Times.Once);\n}\n\nकार्यान्वयन विवरण के परीक्षण से बचें
\nउन्नत दृष्टिकोण — व्यवहार का परीक्षण करें, आंतरिक कॉल का नहीं। केवल महत्वपूर्ण निर्भरताओं के लिए Verify का उपयोग करें। बाकी के लिए, परिणाम की जाँच करें।
2. इंटीग्रेशन परीक्षण: डेटाबेस और बाहरी सेवाएँ
\nइंटीग्रेशन टेस्ट जाँचते हैं कि कई मॉड्यूल एक साथ काम करते हैं। .NET Core/5+ के लिए, आदर्श टूल WebApplicationFactory (ASP.NET Core के लिए) और Testcontainers (निर्भरताओं के कंटेनरीकरण के लिए) है।
\n\nवास्तविक DB के साथ WebApplicationFactory की सेटिंग
\nInMemory-प्रदाता (जो वास्तविक DB से अलग व्यवहार करता है) का उपयोग करने के बजाय, Docker में PostgreSQL या SQL Server चलाने के लिए Testcontainers का उपयोग करें:
\npublic class IntegrationTestFixture : IAsyncLifetime\n{\n private readonly TestcontainersContainer _dbContainer;\n\n public string ConnectionString { get; private set; }\n\n public IntegrationTestFixture()\n {\n _dbContainer = new TestcontainersBuilder<TestcontainersContainer>()\n .WithImage("postgres:15")\n .WithPortBinding(5432, true)\n .WithEnvironment("POSTGRES_USER", "test")\n .WithEnvironment("POSTGRES_PASSWORD", "test")\n .WithEnvironment("POSTGRES_DB", "testdb")\n .Build();\n }\n\n public async Task InitializeAsync()\n {\n await _dbContainer.StartAsync();\n ConnectionString = $"Host=localhost;Port={_dbContainer.GetMappedPublicPort(5432)};" +\n $"Database=testdb;Username=test;Password=test";\n }\n\n public async Task DisposeAsync()\n {\n await _dbConta