http://www.objc.io/issue-2/async-testing.html

ал способ использования SenTestingKit для тестирования интеграции между моим клиентским кодом и нашим сервером. Мне не повезло. Кажется, что когда код запускается в методе, объект уничтожается. Это означает, что любые асинхронные ответы никогда не вызывают селекторы.

Вопросов:

Есть ли способ сохранить объект экземпляром до тех пор, пока я не сочту нужным его уничтожить - т.е. после испытаний?Если нет, то как я могу создать класс, который блокирует (т.е. действует синхронно), пока тесты не будут завершены?

К вашему сведению, я использую тестовый сервер, на котором я знаю ожидаемые результаты.

Я довольно много гуглил, но так или иначе не видел доказательств по этому поводу. Я уверен, что другим тоже будет интересно.

 hfossli26 июл. 2013 г., 12:19
Принятый ответ можно рассматривать как «устаревший». Есть несколько хороших, новых ответов. Может быть, хотите пересмотреть?

Ответы на вопрос(5)

чтобы дождаться завершения асинхронного метода.

- (void)testBlockMethod {
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    // Your block method eg. AFNetworking
    NSURL *url = [NSURL URLWithString:@"http://httpbin.org/ip"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        NSLog(@"IP Address: %@", [JSON valueForKeyPath:@"origin"]);
        STAssertNotNil(JSON, @"JSON not loaded");
        // Signal that block has completed
        dispatch_semaphore_signal(semaphore);
    } failure:nil];
    [operation start];

    // Run loop
    while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                                 beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]];
    dispatch_release(semaphore);

}

http://samwize.com/2012/10/03/sentestingkit-does-not-support-wait-for-blocks/

 Brane20 дек. 2012 г., 20:08
Гениально, пока вы не рассмотрите код, который вы вызываете, вероятно, не отправит сигнал семафора по завершении.
 Matt Connolly08 февр. 2013 г., 01:34
Если ваш цикл здесь и ваш обратный вызов выполняются в одном и том же (основном) потоке, тогда флаг__block BOOL finished = NO и затем установите Finished на true в обратном вызове будет работать. Обратный вызов и тест сериализуются в главном потоке, поэтому для семафора нет необходимости / необходимости, например:mattconnolly.wordpress.com/2012/05/29/...
 Johannes Fahrenkrug16 нояб. 2012 г., 20:06
Brilliant! Спасибо!
 NSCry09 нояб. 2012 г., 12:55
Я сделал именно так, как ваш код, но он никогда не печатает журнал внутри блока успеха.
 Ben G07 февр. 2013 г., 17:10
Идеально подходит и для меня. Я видел в другом потоке SO использование NSCondionalLocking, которое не работает должным образом, так как он блокирует основной поток и не позволяет AFNetworking отправлять обратные вызовы об успехе / ошибке.
Решение Вопроса

переключиться наGHUnit, который на самом деле содержит поддержку ожидания асинхронных событийсузьте дизайн ваших тестов, чтобы вы могли тестировать вещи как они есть. Например. проверьте, что код вашего контроллера вызывает отсоединение и запуск селектора, и (отдельно) проверьте, что этот селектор делает то, что должен. Если обе эти вещи работают, то вы можете быть уверены, что ваш контроллер отключает правильную работу.
 hocker01 июн. 2011 г., 09:41
GHUnit кажется лучшим выбором здесь. Страница примеров наgabriel.github.com/gh-unit/_examples.html показывает именно то, что мне нужно проверить ... время, чтобы изучить новый инструмент!
 hocker31 мая 2011 г., 19:25
К сожалению, я тестирую процесс connect-encrypt-authenticate-getsomedata, который не может быть разбит без наличия чего-то постоянного для обработки обратных вызовов. SenTestingKit, кажется, не дает мне настойчивость, в которой я нуждаюсь. Но я посмотрю на GHUnit.
 ma11hew2802 окт. 2012 г., 15:32
 hocker31 мая 2011 г., 19:23
Киви выглядит интересно. Он обрабатывает асинхронные обратные вызовы?

Этот проектhttps://github.com/hfossli/AGAsyncTestHelper имеет очень удобный макрос

WAIT_WHILE(<expression_to_evaluate>, <max_duration>);

Что позволяет вам написать тест так

- (void)testDoSomething {

    __block BOOL somethingIsDone = NO;

    [MyObject doSomethingAsyncThenRunCompletionBlockOnMainQueue:^{
        somethingIsDone = YES;
    }];

    WAIT_WHILE(!somethingIsDone, 1.0); 
    NSLog(@"This won't be reached until async job is done");
}

Ваш ответ на вопрос