2015-03-19 13 views
11

Die Dokumentation für XCTest waitForExpectationsWithTimeout: Handler :, besagt, dassWie kann man mit XCTest mehrere diskrete Sequenzen von {expectations -> wait} verketten?

Nur ein -waitForExpectationsWithTimeout: Handler: kann zu einem bestimmten Zeitpunkt, sondern mehrere diskrete Sequenzen von {Erwartungen -> Warte} aktiv sein können miteinander verkettet werden.

Ich habe jedoch keine Ahnung, wie dies zu implementieren, noch kann ich Beispiele finden. Ich arbeite an einer Klasse, die zuerst alle verfügbaren seriellen Ports finden muss, den richtigen Port auswählen und sich dann mit dem Gerät verbinden muss, das an diesen Port angeschlossen ist. Also arbeite ich mit mindestens zwei Erwartungen, XCTestExpectation * expectationAllAvailablePorts und * expectationConnectedToDevice. Wie würde ich diese beiden ketten?

Antwort

0

swift

let expectation1 = //your definition 
let expectation2 = //your definition 

let result = XCTWaiter().wait(for: [expectation1, expectation2], timeout: 10, enforceOrder: true) 

if result == .completed { 
    //all expectations completed in order 
} 
+1

Die Technik hat die Dokumentation endlich eingeholt. Ich habe das auch in Objective-C benutzt und es funktioniert wirklich. –

7

Ich mache folgendes und es funktioniert.

expectation = [self expectationWithDescription:@"Testing Async Method Works!"]; 

[AsynClass method:parameter callbackFunction:^(BOOL callbackStatus, NSMutableArray* array) { 
    [expectation fulfil]; 
    // whatever 
}]; 

[self waitForExpectationsWithTimeout:5 handler:^(NSError *error) { 
    if (error) { 
     XCTFail(@"Expectation Failed with error: %@", error); 
    } 
    NSLog(@"expectation wait until handler finished "); 
}]; 

// do it again 

expectation = [self expectationWithDescription:@"Testing Async Method Works!"]; 

[CallBackClass method:parameter callbackFunction:^(BOOL callbackStatus, NSMutableArray* array) { 
    [expectation fulfil]; 
    // whatever 
}]; 

[self waitForExpectationsWithTimeout:5 handler:^(NSError *error) { 
    if (error) { 
     XCTFail(@"Expectation Failed with error: %@", error); 
    } 
    NSLog(@"expectation wait until handler finished "); 
}]; 
3

Die Zuweisung meiner Erwartung an eine schwache Variable funktionierte für mich.

+0

Dieser der Trick !!!! Danke für die Erwähnung der schwachen Variablen! –

+0

* Achtung: * Der obige Link funktioniert möglicherweise nicht mehr. Anstelle einer Seite über schwache Variablen wird nun eine Seite angezeigt, die "Sie" die Installation von "Flash Player Pro" erfordert. Klicken Sie auf die Schaltfläche [x] auf der Website, um die Warnung zu schließen, die eine flüchtige .dmg-Datei auf meinen Mac heruntergeladen hat. Ich habe es nicht geöffnet. WMMV. –

0

Dies scheint für mich auch in Swift 3.0 zu arbeiten.

let spyDelegate = SpyDelegate() 
var asyncExpectation = expectation(description: "firstExpectation") 
spyDelegate.asyncExpectation = asyncExpectation 
let testee = MyClassToTest(delegate: spyDelegate) 
testee.myFunction() //asyncExpectation.fulfill() happens here, implemented in SpyDelegate 

waitForExpectations(timeout: 30.0) { (error: Error?) in 
    if let error = error { 
     XCTFail("error: \(error)") 
    } 
} 

asyncExpectation = expectation(description: "secoundExpectation") 
spyDelegate.asyncExpectation = asyncExpectation 
testee.delegate = spyDelegate 
testee.myOtherFunction() //asyncExpectation.fulfill() happens here, implemented in SpyDelegate 

waitForExpectations(timeout: 30.0) { (error: Error?) in 
    if let error = error { 
     XCTFail("error: \(error)") 
    } 
}