Swift में मॉक, स्टब और फिक्स्चर: बिना दर्द के टेस्टिंग कैसे करें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Swift में टेस्टिंग: मॉक और फिक्स्चर के साथ सिद्धांत से अभ्यास तक

\n\n

कल्पना करें कि आप केक बना रहे हैं और आपका आटा खत्म हो गया है। जब तक आप दुकान नहीं जाते, आप यह नहीं जांच सकते कि क्रीम सही बनेगी या नहीं। लगभग ऐसा ही एक डेवलपर महसूस करता है जब वह नेटवर्क, डेटाबेस या जटिल निर्भरताओं के साथ काम करने वाले कोड के लिए यूनिट-टेस्ट लिखता है। वास्तविक सर्वर या वास्तविक डेटाबेस की प्रतीक्षा करने के बजाय, हम Swift टेस्ट में mock-ऑब्जेक्ट और फिक्स्चर का उपयोग करते हैं — ये हमारे "आटे के विकल्प" हैं, जो हमें यहां और अभी कोड के अलग-अलग टुकड़ों का परीक्षण करने की अनुमति देते हैं।

\n\n

इस लेख में, हम केवल परिभाषाएँ सूचीबद्ध नहीं करेंगे। हम यह समझेंगे कि व्यवहार में Swift टेस्टिंग को सही तरीके से कैसे लागू किया जाए, कब मॉक का उपयोग करना है और कब स्टब का, और कैसे फिक्स्चर डेटा तैयार करने में पागल होने से बचाते हैं। चलिए शुरू करते हैं!

\n\n

mock, stub और fixture क्या हैं? शब्दों को समझना

\n\n

कोड लिखने से पहले, आइए अवधारणाओं पर सहमत हों। iOS यूनिट-टेस्टिंग की दुनिया में, अक्सर मॉक और स्टब को भ्रमित किया जाता है। एक सरल नियम याद रखें:

\n\n
    \n
  • Stub (स्टब) — एक ऑब्जेक्ट जो पूर्व-निर्धारित डेटा लौटाता है। यह जाँच नहीं करता कि इसे कैसे कॉल किया गया। बस उत्तर देता है।
  • \n
  • Mock (मॉक) — एक ऑब्जेक्ट जो न केवल डेटा लौटाता है, बल्कि यह भी जाँचता है कि कुछ विधियाँ कॉल की गईं या नहीं और किन पैरामीटर के साथ। यह एक "जासूस" है।
  • \n
  • Fixture (फिक्स्चर) — डेटा का पूर्व-तैयार सेट (आमतौर पर JSON या संरचना) जो परीक्षणों में एक अनुमानित वातावरण बनाने के लिए उपयोग किया जाता है।
  • \n
\n\n

Swift टेस्टिंग में, हम अक्सर इन दृष्टिकोणों को जोड़ते हैं। उदाहरण के लिए, हम एक JSON फिक्स्चर लोड करते हैं, इसे पार्स करते हैं, और फिर नेटवर्क लेयर को एक मॉक से बदल देते हैं जो जाँचता है कि अनुरोध सही URL पर भेजा गया था।

\n\n

प्रोटोकॉल का उपयोग करके Swift में पहला mock लिखना

\n\n

Swift में mock-ऑब्जेक्ट बनाने का सबसे आम तरीका प्रोटोकॉल का उपयोग करना है। एक वास्तविक प्रोजेक्ट में, आपके पास एक सेवा होती है जो नेटवर्क पर जाती है। परीक्षणों में, आप इसे एक मॉक से बदल देते हैं।

\n\n

यहाँ एक एब्स्ट्रैक्शन का उदाहरण है:

\n\n
// नेटवर्क लेयर के लिए प्रोटोकॉल\nprotocol NetworkServiceProtocol {\n    func fetchUsers(completion: @escaping (Result<[User], Error>) -> Void)\n}\n\n// वास्तविक कार्यान्वयन (नेटवर्क पर जाता है)\nclass RealNetworkService: NetworkServiceProtocol {\n    func fetchUsers(completion: @escaping (Result<[User], Error>) -> Void) {\n        // URLSession, Alamofire आदि\n    }\n}\n\n// परीक्षणों के लिए Mock\nclass MockNetworkService: NetworkServiceProtocol {\n    var fetchUsersCalled = false\n    var resultToReturn: Result<[User], Error> = .success([])\n\n    func fetchUsers(completion: @escaping (Result<[User], Error>) -> Void) {\n        fetchUsersCalled = true\n        completion(resultToReturn)\n    }\n}
\n\n

अब परीक्षण में हम जाँच सकते हैं कि विधि कॉल की गई थी:

\n\n
func testViewModelFetchesUsers() {\n    let mockService = MockNetworkService()\n    mockService.resultToReturn = .success([User(id: 1, name: "Test")])\n\n    let viewModel = UserViewModel(networkService: mockService)\n    viewModel.loadUsers()\n\n    XCTAssertTrue(mockService.fetchUsersCalled, "fetchUsers विधि को कॉल किया जाना चाहिए")\n}
\n\n

ध्यान दें: हम dependency injection Swift का उपयोग कर रहे हैं — इनिशियलाइज़र के माध्यम से निर्भरता पास कर रहे हैं। यह परीक्षण के लिए एक महत्वपूर्ण पैटर्न है।

\n\n

फिक्स्चर: टेस्ट में 100500 लाइनें कैसे न लिखें

\n\n

जब आप JSON पार्सिंग या CoreData के साथ काम का परीक्षण करते हैं, तो आपको वास्तविक डेटा की आवश्यकता होती है। लेकिन हर बार कोड में इसे उत्पन्न करना एक बुरा सपना है। यहाँ Swift टेस्ट में फिक्स्चर मदद करते हैं।

\n\n

टेस्ट फ़ोल्डर में एक फ़ाइल users_fixture.json बनाएँ:

\n\n
[\n    {"id": 1, "name": "Alice", "email": "alice@example.com"},\n    {"id": 2, "name": "Bob", "email": "bob@example.com"}\n]
\n\n

अब

ब्लॉग

पुस्तक अनुशंसाएँ