2014-11-18 6 views
7

टेस्ट यादृच्छिक रूप से waitForExpectation के साथ क्रैश हो जाता है, अगर मैं dispatch_after में अपेक्षा पूरी करता हूं।आईओएस टेस्ट इंतजार के साथ क्रैश हो जाता हैफॉरएक्सपेक्शंसथथटाइम

यह उद्देश्य-सी और तेज़ दोनों में होता है।

पूरी तरह से यादृच्छिक रूप से, कभी-कभी यह कभी-कभी काम नहीं करता है। क्या किसी को कोई ख़याल है? (मैं इसे MacMini पर अध्यक्ष एवं प्रबंध निदेशक + U का उपयोग कर चला रहा हूँ, लेकिन मैं यह भी MBP रेटिना, एक ही परिणाम के साथ की कोशिश की)

उदाहरण कोड:

func testBarcodeNotFound() { 
     let exp = self.expectationWithDescription("store loading") 
     OHHTTPStubs.stubRequestsPassingTest({ (request:NSURLRequest!) -> Bool in 
      if request.URL.absoluteString == nil { 
       return false 
      } 
      return request.URL.absoluteString!.hasSuffix("/products/barcode/1422/") 
      }, withStubResponse: { (request:NSURLRequest!) -> OHHTTPStubsResponse! in 
       let data = "".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 
       return OHHTTPStubsResponse(data: data, statusCode: 404, headers: ["Content-Type":"application/json"]) 

     }) 
     self.productsVC.scanningVC.successScan("1422", "EAN13") 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {() -> Void in 
      exp.fulfill() 
     } 

     self.waitForExpectationsWithTimeout(1, handler: nil) 

     XCTAssertTrue(self.delegateForProductsVC.barcodeNotFoundCalled) 

    } 

और पश्व-अनुरेखन

(lldb) bt 
* thread #1: tid = 0x27e405, 0x06461ab0 libdispatch.dylib`_dispatch_semaphore_dispose + 92, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 
    frame #0: 0x06461ab0 libdispatch.dylib`_dispatch_semaphore_dispose + 92 
    frame #1: 0x06463578 libdispatch.dylib`_dispatch_dispose + 43 
    frame #2: 0x064759e1 libdispatch.dylib`_os_object_dispose + 33 
    frame #3: 0x06475cb1 libdispatch.dylib`-[OS_dispatch_object _xref_dispose] + 58 
    frame #4: 0x064759bb libdispatch.dylib`_os_object_xref_dispose + 33 
    frame #5: 0x05759eb1 libobjc.A.dylib`objc_release + 65 
    frame #6: 0x2011949d XCTest`__destroy_helper_block_95 + 29 
    frame #7: 0x064e4793 libsystem_sim_blocks.dylib`_Block_release + 211 
    frame #8: 0x0647603f libdispatch.dylib`_dispatch_client_callout + 14 
    frame #9: 0x0645f764 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 470 
    frame #10: 0x05af095e CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 14 
    frame #11: 0x05aaf760 CoreFoundation`__CFRunLoopRun + 2256 
    frame #12: 0x05aaebcb CoreFoundation`CFRunLoopRunSpecific + 443 
    frame #13: 0x05aae9fb CoreFoundation`CFRunLoopRunInMode + 123 
    frame #14: 0x04c2ed98 Foundation`-[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 309 
    frame #15: 0x20119a31 XCTest`-[XCTestCase(AsynchronousTesting) waitForExpectationsWithTimeout:handler:] + 1192 
    * frame #16: 0x1055be0b SomeAppNative`SomeApp.ProductsDelegatesViewControllerTest.testBarcodeNotFound (self=0x7b0dbdf0)() ->() + 5595 at ProductsDelegatesViewControllerTest.swift:108 
    frame #17: 0x1055c1a2 SomeAppNative`@objc SomeApp.ProductsDelegatesViewControllerTest.testBarcodeNotFound (SomeApp.ProductsDelegatesViewControllerTest)() ->() + 34 at ProductsDelegatesViewControllerTest.swift:0 
    frame #18: 0x05a7976d CoreFoundation`__invoking___ + 29 
    frame #19: 0x05a79618 CoreFoundation`-[NSInvocation invoke] + 360 
    frame #20: 0x2010897b XCTest`-[XCTestCase invokeTest] + 320 
    frame #21: 0x20108bb9 XCTest`-[XCTestCase performTest:] + 184 
    frame #22: 0x20114162 XCTest`-[XCTest run] + 314 
    frame #23: 0x20107598 XCTest`-[XCTestSuite performTest:] + 406 
    frame #24: 0x20114162 XCTest`-[XCTest run] + 314 
    frame #25: 0x20107598 XCTest`-[XCTestSuite performTest:] + 406 
    frame #26: 0x20114162 XCTest`-[XCTest run] + 314 
    frame #27: 0x20107598 XCTest`-[XCTestSuite performTest:] + 406 
    frame #28: 0x20114162 XCTest`-[XCTest run] + 314 
    frame #29: 0x20103de2 XCTest`__25-[XCTestDriver _runSuite]_block_invoke + 61 
    frame #30: 0x20110c82 XCTest`-[XCTestObservationCenter _observeTestExecutionForBlock:] + 184 
    frame #31: 0x20103d06 XCTest`-[XCTestDriver _runSuite] + 285 
    frame #32: 0x20104951 XCTest`-[XCTestDriver _checkForTestManager] + 272 
    frame #33: 0x20104c6b XCTest`-[XCTestDriver runTestSuite:completionHandler:] + 378 
    frame #34: 0x2011775c XCTest`+[XCTestProbe runTests:] + 216 
    frame #35: 0x04c2ab57 Foundation`__NSFireDelayedPerform + 423 
    frame #36: 0x05af08d6 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22 
    frame #37: 0x05af025d CoreFoundation`__CFRunLoopDoTimer + 1309 
    frame #38: 0x05aaf6ba CoreFoundation`__CFRunLoopRun + 2090 
    frame #39: 0x05aaebcb CoreFoundation`CFRunLoopRunSpecific + 443 
    frame #40: 0x05aae9fb CoreFoundation`CFRunLoopRunInMode + 123 
    frame #41: 0x0712e24f GraphicsServices`GSEventRunModal + 192 
    frame #42: 0x0712e08c GraphicsServices`GSEventRun + 104 
    frame #43: 0x034518b6 UIKit`UIApplicationMain + 1526 
    frame #44: 0x0053dae5 SomeApp`main(argc=16, argv=0xbff6e4a4) + 213 at main.m:16 
    frame #45: 0x0649cac9 libdyld.dylib`start + 1 
(lldb) 

उत्तर

0

मैं था वही मुद्दा। मेरे लिए फिक्स टाइमआउट अंतराल बढ़ रहा है। मैं मूल रूप से 1 का टाइमआउट अंतराल था और सुरक्षित पक्ष पर रहने के लिए इसे 5 तक बढ़ा दिया। अब ठीक काम करने लगते हैं। मुझे यकीन नहीं है कि आपका एसिंक कॉल कब तक लेता है, या यदि आप 1 से अधिक समय समाप्ति अंतराल पर खर्च कर सकते हैं, लेकिन यह एक शॉट के लायक है।

+0

मैंने कोशिश की, 50% मामलों में इससे मदद मिली। आप कोड में देख सकते हैं कि मैंने पोस्ट किया है कि async सिर्फ 'dispatch_after' है जो '0.5s' प्रतीक्षा करता है। अंत में मैं प्रतीक्षा ब्लॉक के बाद उम्मीदों को पूरा कर रहा हूं और प्रतीक्षा ब्लॉक के बाद भी सभी आवेषण कर रहा हूं। तो प्रतीक्षा करते समय कुछ भी नहीं होता है लेकिन पूरा करता है। –

0

स्विफ्ट को एक ही दायरे में बंद होने पर सही अपवाद ब्रेक पॉइंट दिखाने के लिए विशेष समस्या है।

मैंने एक एक्ससीटीएस्टकेस में एक ही समस्या देखी है जो dispatch_after का उपयोग करती है और यहां तक ​​कि अपवाद ब्रेकपॉइंट के माध्यम से waitForExpectationsWithTimeout जैसी ही पंक्ति थी, परीक्षण स्थिति किसी शून्य ऑब्जेक्ट पर डाउनकास्ट की वजह से क्रैश हो रही थी।

मुझे पता है कि यह आपका मामला नहीं है, लेकिन जब भी ऐसा होता है तो मैं सुझाव देता हूं कि एक समय में एक पंक्ति को एक पंक्ति को हटा दें और प्रत्येक निष्कासन के बाद परीक्षण चलाएं। यदि परीक्षण दुर्घटनाग्रस्त नहीं होता है, तो आपने अपराधी की पहचान की है। दुर्भाग्यवश दुर्भाग्यवश इस लेखन के समय सबसे अच्छा विकल्प है जब भी स्विफ्ट एक ऐसी रेखा पर एक अपवाद ब्रेकपॉइंट दिखाता है जो समझ में नहीं आता है, विशेष रूप से क्रैश रिपोर्टिंग टूल में देखे जाने वाले वर्ग की कुख्यात रेखा 0।

हमें बताएं कि क्या आपने अपना दुर्घटना निकाला है।

1

मुझे इसी तरह के मुद्दों का सामना करना पड़ा और मुझे पता लगाने में तीन दिन लगे।

-waitForExpectationsWithTimeout:handler: के प्रलेखन का कहना है:

* -waitForExpectationsWithTimeout:handler: runs the run loop while handling events until all expectations 
* are fulfilled or the timeout is reached. Clients should not manipulate the run 
* loop while using this API. 

सबसे अधिक संभावना आपके NSInputStream या NSOutputStream इंतजार कर के दौरान runloop प्रभावित करने के लिए है, जो एक दुर्घटना का कारण होगा कोशिश कर रहा है।

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