2013-10-01 1 views
12

Извините за вопрос noob, но я пытаюсь проверить соединение, но я не могу проверить возврат запроса, потому что тест заканчивается до того, как обработчик завершения имеет шанс выполнить. Для ilustrate:Как проверить sendAsynchronousRequest: на 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"); 

} 

Когда я пытаюсь утверждать, _data всегда будет нулевым, так как обработчик завершения еще не был выполнен. Существует механизм, чтобы заставить тест ждать, пока у меня не будет ответа от метода sendAsynchronousRequest :. Спасибо заранее.

ответ

22

Это выглядит именно то, что вам нужно:

XCAsyncTestCase: Асинхронный способный SenTestCase подкласс.

В принципе, вы должны написать тест, как это:

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

Обратите внимание на waitForTimeout: вызов и notify: вызовы. 10 секунд должно быть достаточно для теста, хотя это будет зависеть от самого запроса.

Вы могли даже получить более конкретные и ждать определенного статуса, например, так:

[self waitForStatus: XCTAsyncTestCaseStatusSucceeded timeout:10]; 

Таким образом, если соединение не уведомит XCTAsyncTestCaseStatusSucceeded статус, вызов ожидания таймаут и ваш тест потерпит неудачу (как это должно).

+0

Благодаря человеку, что это именно то, что я искал! –

+1

Возможно, было бы полезно знать, что одна из известных проблем, упомянутых в readme XCAsyncTestCase, заключается в том, что «тесты зависают при запуске под ботами сборки XCode». Поэтому, если вы используете сборщики ботов, вы можете посмотреть на «xctest-добавления» iheartradio. – eremzeit

5

Вот еще одна альтернатива, XCAsyncTestCase основана на версии GHUnit:

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

Реализуется это то же самое, только импорт и подкласс 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]; 
}