2013-10-01 10 views
12

Przepraszamy za to pytanie typu noob, ale próbuję przetestować połączenie, ale nie mogę zweryfikować zwrócenia żądania, ponieważ test kończy się przed zakończeniem obsługi końcowej szansa na wykonanie. Aby zilustrować:Jak przetestować polecenie sendAsynchronousRequest: na XCTest

-(void)testConnection 
{ 

    [[Conector sharedInstance] performAsynchronousRequestWithServerRequest:_srvRequest completionHandler:^(RequestAsynchronousStatus finishStatus, NSData *data) { 
     if (finishStatus == RequestAsynchronousOK){ 
      _data = data; 
      NSLog(@"Data OK"); 
     } 
    }]; 

    XCTAssertNotNil(_data, @"Data was nil"); 

} 

Kiedy próbuję potwierdzić, _data zawsze będzie zerowa, ponieważ procedura obsługi zakończenia nie została jeszcze wykonana. Istnieje mechanizm, który zmusza test do oczekiwania, aż otrzymam odpowiedź z metody sendAsynchronousRequest :. Z góry dzięki.

Odpowiedz

22

To wygląda dokładnie to, czego potrzebujesz:

XCAsyncTestCase: Asynchronous zdolna SenTestCase podklasy.

Zasadniczo należy napisać test takiego:

- (void)testConnection 
{ 
    [[Conector sharedInstance] performAsynchronousRequestWithServerRequest:_srvRequest completionHandler:^(RequestAsynchronousStatus finishStatus, NSData *data) { 
     if (finishStatus == RequestAsynchronousOK) 
     { 
      _data = data; 
      [self notify:XCTAsyncTestCaseStatusSucceeded]; 
      NSLog(@"Data OK"); 
     } 
    }]; 

    [self waitForTimeout:10]; 

    XCTAssertNotNil(_data, @"Data was nil"); 
} 

zauważenie połączenia waitForTimeout: i połączeń notify:. 10 sekund powinno wystarczyć na test, choć zależy to od samego żądania.

Można nawet uzyskać bardziej szczegółowe i czekać na pewnego statusu, tak jak poniżej:

[self waitForStatus: XCTAsyncTestCaseStatusSucceeded timeout:10]; 

W ten sposób, jeżeli połączenie nie powiadomi status XCTAsyncTestCaseStatusSucceeded, wywołanie wait będzie Timeout a próba nie powiedzie się (jak powinno).

+0

Dzięki stary, to jest dokładnie to, czego szukasz! –

+1

Warto wiedzieć, że jednym ze znanych problemów wymienionych w readme XCAsyncTestCase jest to, że "testy zawieszają się po uruchomieniu pod robotami XCode". Więc jeśli używasz robotów budujących, możesz spojrzeć na 'xctest-additions' autorstwa iheartradio. – eremzeit

5

Oto kolejna alternatywa, XCAsyncTestCase oparta na wersji GHUnit:

https://github.com/iheartradio/xctest-additions

Wykorzystanie jest taka sama, tylko import i podklasa XCAsyncTestCase.

@implementation TestAsync 
- (void)testBlockSample 
{ 
    [self prepare]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(){ 
     sleep(1.0); 
     [self notify:kXCTUnitWaitStatusSuccess]; 
    }); 
    // Will wait for 2 seconds before expecting the test to have status success 
    // Potential statuses are: 
    // kXCTUnitWaitStatusUnknown, initial status 
    // kXCTUnitWaitStatusSuccess, indicates a successful callback 
    // kXCTUnitWaitStatusFailure, indicates a failed callback, e.g login operation failed 
    // kXCTUnitWaitStatusCancelled, indicates the operation was cancelled 
    [self waitForStatus:kXCTUnitWaitStatusSuccess timeout:2.0]; 
} 
Powiązane problemy