Donc Apple a dit dans la note de publication de Xcode 6 que nous pouvons maintenant faire des tests asynchrones directement avec XCTest.
Tout le monde sait comment le faire en utilisant Xcode 6 Beta 3 (en utilisant objective-C ou Swift)? Je ne veux pas de la méthode connue des sémaphores, mais de la nouvelle méthode Apple.
J'ai cherché dans la note publiée et plus mais je n'ai rien trouvé. L'en-tête XCTest n'est pas très explicite non plus.
La vidéo des sessions est parfaite, fondamentalement, vous voulez faire quelque chose comme ça
func testFetchNews() {
let expectation = self.expectationWithDescription("fetch posts")
Post.fetch(.Top, completion: {(posts: [Post]!, error: Fetcher.ResponseError!) in
XCTAssert(true, "Pass")
expectation.fulfill()
})
self.waitForExpectationsWithTimeout(5.0, handler: nil)
}
Exemple d'obj-C:
- (void)testAsyncMethod
{
//Expectation
XCTestExpectation *expectation = [self expectationWithDescription:@"Testing Async Method Works!"];
[MyClass asyncMethodWithCompletionBlock:^(NSError *error, NSHTTPURLResponse *httpResponse, NSData *data) {
if(error)
{
NSLog(@"error is: %@", error);
}else{
NSInteger statusCode = [httpResponse statusCode];
XCTAssertEqual(statusCode, 200);
[expectation fulfill];
}
}];
[self waitForExpectationsWithTimeout:5.0 handler:^(NSError *error) {
if(error)
{
XCTFail(@"Expectation Failed with error: %@", error);
}
}];
}
La session 414 couvre les tests asynchrones dans Xcode6
Comment j'ai fait dans Swift2
Étape 1: définir l'attente
let expectation = self.expectationWithDescription("get result bla bla")
Étape 2: dites au test de répondre aux attentes juste en dessous de l'endroit où vous capturez la réponse
responseThatIGotFromAsyncRequest = response.result.value
expectation.fulfill()
Étape 3: dites au test d'attendre que les attentes soient satisfaites
waitForExpectationsWithTimeout(10)
ÉTAPE 4: effectuer une assertion une fois l'appel asynchrone terminé
XCTAssertEqual(responseThatIGotFromAsyncRequest, expectedResponse)