TypeScript के लिए nock: टेस्ट में HTTP मॉकिंग
1. nock क्या है और इसकी ज़रूरत क्यों है?
nock Node.js के लिए एक शक्तिशाली लाइब्रेरी है, जो HTTP रिक्वेस्ट को इंटरसेप्ट और मॉक करने के लिए बनाई गई है। यह डेवलपर्स को बाहरी सर्विसेज (REST API, थर्ड-पार्टी माइक्रोसर्विसेज, वेबहुक) के रिस्पॉन्स को असली नेटवर्क रिक्वेस्ट किए बिना सिम्युलेट करने की सुविधा देती है। यह यूनिट टेस्ट और इंटीग्रेशन टेस्ट लिखते समय विशेष रूप से महत्वपूर्ण है, जहां स्थिरता और स्पीड का बहुत महत्व है।
इसकी ज़रूरत क्यों है? मान लीजिए आपका एप्लिकेशन पेमेंट गेटवे, मौसम API या HTTP के ज़रिए डेटाबेस को रिक्वेस्ट भेजता है। टेस्टिंग एनवायरनमेंट में आप इन सर्विसेज की उपलब्धता, रिस्पॉन्स स्पीड या रिक्वेस्ट लिमिट पर निर्भर नहीं रहना चाहते। nock इन रिक्वेस्ट को "बदलकर" पहले से तय डेटा लौटाता है। इससे टेस्ट तेज़, अनुमानित और बाहरी कारकों से अलग हो जाते हैं। इसके अलावा, आप एरर सिचुएशन (टाइमआउट, 500 कोड, खाली रिस्पॉन्स) भी टेस्ट कर सकते हैं, जिन्हें असली परिस्थितियों में दोहराना मुश्किल होता है।
TypeScript के संदर्भ में, nock लोकप्रिय टेस्टिंग फ्रेमवर्क (Jest, Mocha, Vitest) के साथ अच्छी तरह से इंटीग्रेट होता है और टाइपिंग को सपोर्ट करता है, जिससे इसके साथ काम करना आसान और सुरक्षित हो जाता है। यह लाइब्रेरी Node.js लेवल पर (http और https मॉड्यूल के ज़रिए) रिक्वेस्ट को इंटरसेप्ट करती है, इसलिए यह किसी भी HTTP क्लाइंट के साथ काम करती है: axios, node-fetch, got और यहां तक कि नेटिव fetch (कुछ शर्तों के साथ)।
2. इंस्टॉलेशन
TypeScript प्रोजेक्ट में nock इंस्टॉल करने के लिए टर्मिनल में निम्नलिखित कमांड में से कोई एक चलाएं:
# npm के ज़रिए
npm install --save-dev nock @types/nock
# yarn के ज़रिए
yarn add --dev nock @types/nock
# pnpm के ज़रिए
pnpm add --save-dev nock @types/nock
महत्वपूर्ण: @types/nock में TypeScript के लिए टाइप डिक्लेरेशन होते हैं। अगर आप TypeScript 4.0+ का उपयोग कर रहे हैं, तो टाइप्स पहले से लाइब्रेरी में बिल्ट-इन हो सकते हैं, लेकिन संगतता के लिए इन्हें स्पष्ट रूप से इंस्टॉल करना बेहतर है।
3. त्वरित शुरुआत
चलिए एक न्यूनतम टेस्ट लिखते हैं जो nock की बुनियादी कार्यप्रणाली दिखाता है। मान लीजिए हमारे पास एक फंक्शन है जो बाहरी API से यूज़र का डेटा प्राप्त करता है।
// userService.ts
import axios from 'axios';
export async function getUser(userId: number): Promise<{ id: number; name: string; email: string }> {
const response = await axios.get(`https://jsonplaceholder.typicode.com/users/${userId}`);
return response.data;
}
अब एक टेस्ट लिखते हैं जो इस रिक्वेस्ट को मॉक करता है:
// userService.test.ts
import nock from 'nock';
import { getUser } from './userService';
describe('getUser', () => {
afterEach(() => {
nock.cleanAll(); // हर टेस्ट के बाद सभी मॉक साफ़ करें
});
it('यूज़र का डेटा लौटाना चाहिए', async () => {
// 1. इंटरसेप्ट सेट करें
const mockUser = { id: 1, name: 'Rahul Sharma', email: 'rahul@example.com' };
nock('https://jsonplaceholder.typicode.com')
.get('/users/1')
.reply(200, mockUser);
// 2. टेस्ट किए जाने वाले फंक्शन को कॉल करें
const user = await getUser(1);
// 3. परिणाम जांचें
expect(user).toEqual(mockUser);
});
it('500 एरर पर एरर फेंकना चाहिए', async () => {
nock('https://jsonplaceholder.typicode.com')
.get('/users/1')
.reply(500, { error: 'Server Error' });
await expect(getUser(1)).rejects.toThrow();
});
});
यह उदाहरण दिखाता है कि कैसे आसानी से सर्वर रिस्पॉन्स को बदला जा सकता है और सफल और एरर दोनों सिचुएशन को टेस्ट किया जा सकता है।