2015-09-28 4 views
8

मैं बिना किसी किस्मत के OHHTTPStubs जैसे टूल का उपयोग करके एक्सकोड 7 स्वचालित यूआई परीक्षणों में HTTP अनुरोधों को अवरुद्ध करने और मजाक करने की कोशिश कर रहा हूं।क्या एक्सकोड 7 स्वचालित यूआई परीक्षणों में HTTP अनुरोधों को रोकना संभव है?

override func setUp() { 
    super.setUp() 

    let matcher: OHHTTPStubsTestBlock = { (request) -> Bool in 
    return true 
    } 

    OHHTTPStubs.stubRequestsPassingTest(matcher) { (response) -> OHHTTPStubsResponse! in 
    return OHHTTPStubsResponse.init() 
    } 
} 

वहाँ तरीका है कि यूआई परीक्षण काम करता है कि इस से बचाता है के बारे में कुछ है:

यहाँ कैसे मैं एक यूआई परीक्षण फ़ाइल की स्थापना विधि में OHHTTPStubs उपयोग कर किसी भी HTTP अनुरोध पर कब्जा करने की कोशिश कर रहा हूँ का एक उदाहरण है? क्या कोई इसे हासिल करने में सक्षम है?

+0

अरे आप एक समाधान के साथ खत्म किया:

इस विषय पर पढ़ने के लिए एक बहुत ही उपयोगी धागा है? – MatterGoal

+0

हां, बस नीचे जोड़ा गया। – dtrenz

+0

गतिशील रूप से HTTP अनुरोधों को रोकने के लिए आप SBTUITestTunnel का उपयोग कर सकते हैं, मेरा उत्तर [यहां] देखें (http://stackoverflow.com/a/36909859/574449) –

उत्तर

8

जैसा कि मार्टिजन सही तरीके से इंगित करता है, यूआई परीक्षण कैसे काम करता है, आप सीधे रनटाइम पर ऐप से बातचीत नहीं कर सकते हैं, इसलिए में NSUserDefaults जैसी चीजों का कोई भी HTTP मॉकिंग या हेरफेर आपके ऐप को प्रभावित नहीं करेगा।

तुम सच में विशिष्ट यूआई परीक्षण के लिए HTTP या सेटअप & टियरडाउन आपकी ऐप्लिकेशन पर्यावरण उपहास करने के लिए सक्षम होना चाहिए, तो आप लांच तर्क सेट या XCUITestCase और उसके बाद की setUp() विधि में एप्लिकेशन को लॉन्च करने से पहले वातावरण चर शुरू करने के लिए की आवश्यकता होगी लॉन्च तर्क या पर्यावरण चर को पढ़ने और परीक्षण वातावरण को बूटस्ट्रैप पढ़ने के लिए अपने ऐप कोड को संशोधित करें।

उदाहरण testcase

class MyTestCase: XCTestCase { 

    /** 
    Called before each test in this test case. 
    */ 
    override func setUp() { 
    super.setUp() 

     let app = XCUIApplication() 
     app.launchArguments = [ "STUB_HTTP_ENDPOINTS" ] 
     app.launch() 
    } 

} 

उदाहरण AppDelegate

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

#if DEBUG 
    if (NSProcessInfo.processInfo().arguments.contains("STUB_HTTP_ENDPOINTS")) { 
    // setup HTTP stubs for tests 
    } 
#endif 

    return true 
} 

नोट: आदेश इस उदाहरण, छोटा करते कोड और किसी भी JSON में OHHTTPStubs तरह ढांचे मजाक एक HTTP का उपयोग करने के आपको जिस फिक्स्चर का उपयोग करने की आवश्यकता है, उसे सभी को आपके लक्ष्य लक्ष्य में होना चाहिए, परीक्षण लक्ष्य नहीं। https://github.com/AliSoftware/OHHTTPStubs/issues/124

+0

ऐसा लगता है कि यह वास्तव में आपको स्टबिंग प्राप्त करने की अनुमति देगा, आप इसके अंदर "कोड" और स्टब्बेड नेटवर्क फ़ाइलों को दबाकर एक ऐप भेज देंगे। जो शायद करने के लिए एक बहुत ही बुरी चीज है। – Daniel

+0

मैं डीबीयूजी प्रीप्रोसेसर मैक्रो पर चेक अगर एक स्टबिंग कोड लपेटता हूं, तो स्टबिंग कोड वास्तव में इसे ऐप स्टोर बिल्ड में नहीं बनाना चाहिए। मैंने इसे दिखाने के लिए कोड नमूने अपडेट कर दिए हैं। इस पर ध्यान दिलाने के लिए धन्यवाद। – dtrenz

3

यूआई परीक्षण आपके आवेदन से एक अलग उदाहरण में चलाए जाते हैं। जबकि आवेदन से कक्षाएं आपके लिए उपलब्ध हो सकती हैं, वे केवल एक प्रतिलिपि हैं।

अपने आवेदन में आप अगर आप यहाँ प्रदान समाधान के साथ यूआई परीक्षण मोड में चला रहे हैं का पता लगाने कर सकते हैं: How to detect if iOS app is running in UI Testing mode

मैं व्यक्तिगत रूप से launchEnvironment समाधान मूल पोस्ट में उल्लेख किया साथ चला गया; मेरे सेटअप इस तरह दिखता है:

override func setUp() { 
    super.setUp() 

    let app = XCUIApplication() 
    app.launchEnvironment["TEST"] = "1" 
    app.launch() 
} 

और मेरी सिंगलटन instantiators (RealmManager कहा जाता है) में से एक (एक क्षेत्र डेटाबेस instantiating के लिए) इस प्रकार है:

func realm() -> Realm { 
    let dic = NSProcessInfo.processInfo().environment 
    if dic["TEST"] != nil { 
     return try! Realm(configuration: Realm.Configuration(inMemoryIdentifier: "test")) 
    } 
    return try! Realm() 
} 

आप दोहराव नापसंद हैं, लेकिन आप ' फिर भी XCUIApplication().launch() वैसे भी डुप्लिकेट कर रहे हैं, आप हमेशा एक कस्टम टेस्ट केस क्लास बना सकते हैं जो XCTestCase का विस्तार करता है, इस अतिरिक्त के साथ सेटअप को ओवरराइड करें और फिर अपने सभी टेस्ट क्लास में इसका उपयोग करें।

+0

आप विभिन्न परीक्षण मामलों को कैसे करते हैं?उदाहरण के लिए, यदि मैं लॉगिन सफलता और लॉगिन विफलता का परीक्षण करना चाहता हूं, तो सर्वोत्तम अभ्यास दो अलग-अलग प्रतिक्रियाओं को रोकना होगा ... आप अपने तर्क के साथ ऐसा कुछ कैसे संभालेंगे? मैं केवल तभी समझ सकता हूं कि मैं "ऐप दायरे" या "परीक्षण क्षेत्र" में चल रहा हूं, लेकिन मैं अलग-अलग "परीक्षण क्षेत्र" प्रतिक्रियाओं को संभाल नहीं सकता। – MatterGoal

+0

नकली उपयोगकर्ता? "उपयोगकर्ता" + "गलत पासवर्ड" = असफल, "उपयोगकर्ता" + "पासवर्ड" = सफलता। –

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