2016-02-02 14 views
6

मेरे पास अलामॉफ़ीयर का उपयोग करके स्विफ्ट 2 कोड है जो एक दूरस्थ यूआरएल से पूछता है कि वह जेएसओएन वापस करने की अपेक्षा करता है। मैंने पर्याप्त रूप से आत्मविश्वास के लिए पर्याप्त इंटरैक्टिव परीक्षण किया है कि यह सही ढंग से पर्याप्त व्यवहार करता है। अब मैं इसे यूनिट-टेस्ट करना चाहता हूं ताकि मैं इस कोड पर भरोसा कर सकूं और फिर अन्य चीजों पर जा सकूं।मैं केवल अलामोफ़ीयर प्रतिक्रिया का नकल कैसे करूं?

मैं स्विफ्ट के लिए नया हूं, हालांकि मैं दशकों से ओओ पर्ल प्रोग्रामिंग कर रहा हूं, इसलिए शायद कुछ ऐसा है जो मैंने याद किया है।

यहां बताया गया है कि मैंने अब तक जांच कोड कैसे स्थापित किया है (जैसे कि मुझे योक-शेविंग से बचने के लिए उपयोगकर्ता नाम और पासवर्ड कैसे हटाया जाता है)। कॉलिंग कोड उपयोगकर्ता नाम और पासवर्ड निर्दिष्ट करता है, और जब भी परिणाम प्राप्त होता है तो दो कॉलबैक में से एक को कॉल किया जाना चाहिए। (जहाँ तक मैं नहीं मिला त्रुटियों के साथ काम कर के रूप में है, इसलिए पक्ष पर नज़र रखी है कि इस विषय पर नहीं मिलता है कृपया।)

struct checkUsernameHandler { 
    var onSuccess:() ->() 
    var onFailure:() ->() 
} 
struct checkUsernameOutput { 
    var authenticated: Bool? 
} 

func checkUsername(user: User, handler: checkUsernameHandler) { 
    Alamofire.request(.PUT, NSURL(string: baseURL + "/user/verify?key=" + apiKey)!, 
     parameters: [ 
      "username": user.username!, 
      "password": user.password!, 
     ], 
     encoding: .JSON 
    ).responseJSON { response in 
     let checkusernameOutput = self.analyseCheckUsernameResponse(response) 
     if let authenticated = checkusernameOutput.authenticated { 
      if authenticated { 
       handler.onSuccess() 
      } else { 
       handler.onFailure() 
      } 
     } 
    } 
} 

func analyseCheckUsernameResponse (response: Response<AnyObject, NSError>) -> checkUsernameOutput { 
    var output = checkUsernameOutput() 
    if (response.result.isSuccess) { 
     if let JSON = response.result.value as? NSDictionary { 
      // ... 
     } 
    } else { 
     print("Didn't get proper JSON or something: \(response.result.error)") 
    } 
    return output 
} 

क्या मैं के लिए देख रहा हूँ कच्चे JSON लेती हैं और उसे पास करने का तरीका है किसी भी तरह से अलामोफायर के लिए, इसलिए मैं एक प्रतिक्रिया ऑब्जेक्ट उत्पन्न कर सकता हूं जिसमें उचित चीजें हैं, जिसमें त्रुटियां भी शामिल हैं, अगर उन्हें कुछ भी नहीं मिला (टाइमआउट?) या लौटाया गया डेटा अमान्य था (उदाहरण के लिए एक HTML प्रारूप 404 या 500 पृष्ठ)।

मैं फ़ंक्शन चेक उपयोगकर्ता नाम के साथ इस समय पर्याप्त खुश हूं, इसलिए मुझे "OHHTTPStubs का उपयोग करने" में कोई दिलचस्पी नहीं है। मैं केवल उस कोड का परीक्षण कर रहा हूं जिसके बारे में मुझे अनिश्चितता है, जो कोड मैंने अभी लिखा है।

संपादित: अधिक कुछ के बारे में faffed करने के बाद, ऐसा लगता है Alamofire के internals की तरह पर्याप्त रूप से जुड़े हुए हैं एक नकली प्रतिक्रिया बनाने के लिए है कि, मैं बहुत ज्यादा सब एक नेटवर्क कनेक्शन वैसे भी की स्थापना में शामिल काम की ज़रूरत है। तो शायद जवाब है "ऐसा करने में बहुत परेशानी है"?

+0

आप "नकली Alamofire" के लिए खोज की है, वहाँ हो रहा है कुछ उपयोगी सुझाव जैसे https://github.com/Alamofire/Alamofire/blob/master/Tests/URLProtocolTests.swift#L27-L81 और http://stackoverflow.com/questions/26918593/unit-testing-http-traffic -in-alamofire-app – Michael

+1

हां, इसलिए मैंने क्यों कहा कि मुझे पूरे ढेर का मज़ाक लगाने में कोई दिलचस्पी नहीं है, यही वह पोस्ट है जो ज्यादातर सुझाई जाती है। –

+0

क्या आपको केवल प्रतिक्रिया का मज़ाक लगाने का कोई तरीका मिल गया है? –

उत्तर

4

मुझे URLProtocol की स्टार्टलोडिंग विधि को ओवरराइड करके सफलता मिली थी। आप URLProtocolTests.swift के तहत Alamofire की परीक्षण निर्देशिका के भीतर इसका एक उदाहरण पा सकते हैं।

इस कॉल को अवरुद्ध करके, कोई आने वाले अनुरोध को कैप्चर कर सकता है और फिर अपने चुने हुए नकली प्रतिक्रिया से मेल खाने के लिए यूआरएल को पार्स कर सकता है।

override func startLoading() { 
    //Seperate module I used to handle the request 
    let data:NSData = mocks.find(request) as! NSData 

    let client = self.client 
    let response = HTTPURLResponse(url: (request.url)!, statusCode: 200, httpVersion: "HTTP/1.1", headerFields: cannedHeaders) 

    client?.urlProtocol(self, didReceive: response!, cacheStoragePolicy: URLCache.StoragePolicy.notAllowed) 
    cannedResponse = data 
    client?.urlProtocol(self, didLoad: cannedResponse as! Data) 
    client?.urlProtocolDidFinishLoading(self) 

    activeTask?.resume() 
} 

मैं कैसे यहाँ GitHub पर यह करने के लिए की एक पूरी उदाहरण तैनात: नीचे मैं कैसे प्रतिक्रिया संभाल का एक उदाहरण है https://github.com/ksteigerwald/MockAlamofire

+0

यहां एक गिटहब लाइब्रेरी है जो इस https://github.com/ksteigerwald/Hunkered को सरल बनाती है – rambossa

संबंधित मुद्दे