परिचय: बिना Mock के टेस्ट — बिना कैफीन की कॉफी जैसे?
\n\nकल्पना करें: आप TypeScript में एक ऐप बना रहे हैं जो ईमेल भेजता है, डेटाबेस से बात करता है और बाहरी API का उपयोग करता है। आप टेस्ट चलाते हैं — और अचानक सब कुछ फेल हो जाता है क्योंकि मेल सर्वर अस्थायी रूप से डाउन है। परिचित लग रहा है?
\n\nयहीं पर mock-ऑब्जेक्ट्स (नकली ऑब्जेक्ट्स) और fixtures (टेस्ट डेटा) काम आते हैं। ये आपके कोड को बाहरी दुनिया से अलग करते हैं और टेस्ट को तेज़, विश्वसनीय और अनुमानित बनाते हैं। इस लेख में हम वास्तविक उदाहरणों के साथ सीखेंगे कि TypeScript में mock का सही उपयोग कैसे करें, TypeScript के लिए fixtures क्या होते हैं और गलतियों से कैसे बचें।
\n\nयह लेख PythonLib के लिए लिखा गया है — एक शैक्षिक पोर्टल जहाँ हम गुणवत्तापूर्ण कोड लिखना सिखाते हैं। चलिए शुरू करते हैं!
\n\nMock ऑब्जेक्ट्स और Fixtures क्या हैं?
\n\nMock ऑब्जेक्ट्स: आपके कोड में स्टंट डबल्स
\n\nMock ऑब्जेक्ट (या सिर्फ mock) एक वास्तविक ऑब्जेक्ट का विकल्प है जो उसके व्यवहार की नकल करता है। आप कहते हैं: "जब sendEmail() मेथड कॉल हो, तो true लौटाओ"। और टेस्ट असली ईमेल सर्वर को नहीं छूता।
\n\nTypeScript में, mock आमतौर पर Jest या Vitest लाइब्रेरीज़ के साथ बनाए जाते हैं। ये आपको जाँचने देते हैं कि मेथड कॉल हुआ या नहीं, किन आर्गुमेंट्स के साथ और कितनी बार।
\n\nFixtures: टेस्ट के लिए तैयार डेटा
\n\nFixtures पहले से तैयार डेटा सेट होते हैं। जैसे, एक यूज़र ऑब्जेक्ट, ऑर्डर की लिस्ट या ऐप कॉन्फ़िगरेशन। हर बार मैन्युअली डेटा बनाने के बजाय, आप fixtures को अलग फ़ाइलों में स्टोर करते हैं।
\n\nmock + fixture का कॉम्बिनेशन 2024 में TypeScript टेस्टिंग का मानक है।
\n\nप्रैक्टिस: Mock और Fixtures के साथ टेस्ट लिखना
\n\nएनवायरनमेंट सेटअप
\n\nउदाहरणों के लिए हम Jest का उपयोग करेंगे (हालाँकि यह सब Vitest में भी काम करता है)। सुनिश्चित करें कि आपने डिपेंडेंसीज़ इंस्टॉल कर ली हैं:
\n\nnpm install --save-dev jest @types/jest ts-jest\n\njest.config.js में यह जोड़ें:
module.exports = {\n preset: 'ts-jest',\n testEnvironment: 'node',\n};\n\nउदाहरण 1: ईमेल भेजने वाले सर्विस का Mock
\n\nमान लीजिए हमारे पास एक नोटिफिकेशन सर्विस है:
\n\n// notificationService.ts\nexport class EmailService {\n async sendEmail(to: string, subject: string, body: string): Promise<boolean> {\n // असली भेजने का कोड — हम इसे नहीं छेड़ेंगे\n return true;\n }\n}\n\nexport class NotificationManager {\n constructor(private emailService: EmailService) {}\n\n async notifyUser(email: string, message: string): Promise<string> {\n const result = await this.emailService.sendEmail(email, 'सूचना', message);\n return result ? 'भेजा गया' : 'त्रुटि';\n }\n}\n\nअब mock-ऑब्जेक्ट के साथ टेस्ट लिखते हैं:
\n\n// notificationService.test.ts\nimport { NotificationManager, EmailService } from './notificationService';\n\ndescribe('NotificationManager', () => {\n it('सूचना भेजकर "भेजा गया" लौटाना चाहिए', async () => {\n // Mock बनाएँ\n const mockEmailService: jest.Mocked<EmailService> = {\n sendEmail: jest.fn().mockResolvedValue(true),\n };\n\n const manager = new NotificationManager(mockEmailService);\n const result = await manager.notifyUser('test@test.com', 'नमस्ते!');\n\n expect(result).toBe('भेजा गया');\n expect(mockEmailService.sendEmail).toHaveBeenCalledWith(\n 'test@test.com',\n 'सूचना',\n 'नमस्ते!'\n );\n });\n\n it('भेजने में विफलता पर "त्रुटि" लौटाना चाहिए', async () => {\n const mockEmailService: jest.Mocked<EmailService> = {\n sendEmail: jest.fn().mockResolvedValue(false),\n };\n\n const manager = new NotificationManager(mockEmailService);