2015-03-19 6 views
11

Dokumentacja XCTest waitForExpectationsWithTimeout: teleskopowa :, twierdzi, żeKorzystając z XCTest, jak można połączyć wiele dyskretnych sekwencji {oczekiwania -> czekać}?

Tylko jeden -waitForExpectationsWithTimeout: teleskopowa: może być aktywny w danym momencie, ale wiele dyskretnych sekwencje {oczekiwań -> wait} mogą być połączone w łańcuch.

Jednak nie mam pojęcia, jak to wdrożyć, ani nie mogę znaleźć żadnych przykładów. Pracuję nad klasą, która najpierw musi znaleźć wszystkie dostępne porty szeregowe, wybrać odpowiedni port, a następnie połączyć się z urządzeniem podłączonym do tego portu. Pracuję z co najmniej dwoma oczekiwaniami, XCTestExpectation * expectationAllAvailablePorts i * expectationConnectedToDevice. Jak mógłbym połączyć te dwa?

Odpowiedz

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

Technika wreszcie dogoniła dokumentację. Używałem tego także w Objective-C i to naprawdę działa. –

7

Wykonuję następujące czynności i to działa.

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

Przypisywanie moich oczekiwań do słabej zmiennej zadziałało dla mnie.

+0

To załatwiło sprawę !!!! Dzięki, że wspomniałeś o słabej zmiennej! –

+0

* Uwaga: * Powyższy link "tutaj" może przestać działać. Zamiast strony o słabych zmiennych, prezentuje teraz stronę, która "wymaga" zainstalowania "Flash Player Pro". Kliknięcie przycisku [x] na stronie internetowej, aby "zamknąć" ostrzeżenie, pobrało szkicowy plik .dmg na mój komputer Mac. Nie otworzyłem tego. WMMV. –

0

Wydaje się, że działa to również w Swift 3.0.

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)") 
    } 
}