Почему ложное утверждение в асинхронном тесте в GHUnit приводит к сбою приложения, а не просто к провалу теста? - PullRequest
11 голосов
/ 30 сентября 2011

Этот вопрос имеет очень мало просмотров и пока нет ответов. Если у вас есть предложение, что изменить в этом вопросе, чтобы получить больше глазных яблок, я был бы рад их услышать. Ура!

Я использую GHAsyncTestCase для проверки моего NSOperation моего. Я устанавливаю тестовый случай в качестве делегата для объекта операции, и я вызываю didFinishAsyncOperation в главном потоке, когда это будет сделано.

Когда утверждение терпит неудачу, оно выдает исключение, которое должно быть перехвачено тестовым набором, чтобы сделать тест "неудачным". Но вместо этого ожидаемого поведения мое приложение отменяется Xcode, как только утверждение не выполняется.

*** Завершение работы приложения из-за необработанного исключения «GHTestFailureException», причина: «НЕТ» должно быть ИСТИНА. Это должно вызвать неудачный тест, но вместо этого вылетает мое приложение. '

Я явно что-то делаю не так. Кто мне скажет?

@interface TestServiceAPI : GHAsyncTestCase
@end

@implementation TestServiceAPI

    - (BOOL)shouldRunOnMainThread
    {
        return YES;
    }

    - (void)testAsyncOperation
    {
        [self prepare];

        MyOperation *op = [[[MyOperation alloc] init] autorelease];

        op.delegate = self; // delegate method is called on the main thread.

        [self.operationQueue addOperation:op];

        [self waitForStatus:kGHUnitWaitStatusSuccess timeout:1.0];
    }

    - (void)didFinishAsyncOperation
    {
        GHAssertTrue(NO, @"This should trigger a failed test, but crashes my app instead.");

        [self notify:kGHUnitWaitStatusSuccess forSelector:@selector(testAsyncOperation)];
    }

@end

Ответы [ 4 ]

12 голосов
/ 09 октября 2011

Я копался в течение недели, чтобы найти решение этой проблемы, когда, наконец, поймал перерыв.Было немного странно, что рядом с вопросом о награде почти не было взглядов, и никто не пытался найти ответ.Я думал, что вопрос может быть глупым, но не было никаких отрицательных голосов, и никто не хотел исправить это также.Не стал ли StackOverflow настолько насыщенным?

Решение.

Хитрость заключается в том, чтобы не утверждать что-либо из метода обратного вызова, но вернуть утверждения обратно в исходный тест.Метод wait фактически блокирует поток, о котором я раньше не думал.Если ваш асинхронный обратный вызов получает какие-либо значения, просто сохраните их в ivar или свойстве, а затем сделайте утверждения на их основе в исходном методе тестирования.

Это заботится о подтверждениях, не вызывающих сбоев.

- (void)testAsyncOperation
{
    [self prepare];

    MyOperation *op = [[[MyOperation alloc] init] autorelease];

    op.delegate = self; // delegate method is called on the main thread.

    [self.operationQueue addOperation:op];

    // The `waitfForStatus:timeout` method will block this thread.
    [self waitForStatus:kGHUnitWaitStatusSuccess timeout:1.0];

    // And after the callback finishes, it continues here.
    GHAssertTrue(NO, @"This triggers a failed test without anything crashing.");
}

- (void)didFinishAsyncOperation
{
    [self notify:kGHUnitWaitStatusSuccess forSelector:@selector(testAsyncOperation)];
}
2 голосов
/ 29 марта 2013

Найдите свой навигатор точек останова Xcode, удалите все точки останова исключений, вот и все !!!

0 голосов
/ 19 февраля 2014

Я думаю, что этот вопрос должен быть скорее "как проверить методы с блоками в GHUnit"?

А ответ можно найти здесь: http://samwize.com/2012/11/25/create-async-test-with-ghunit/

0 голосов
/ 09 октября 2011

Глядя на файлы заголовков для GHUnit, похоже, что это может произойти с вашим кодом. Подкласс GHUnit может переопределить этот метод:

// Override any exceptions; By default exceptions are raised, causing a test failure
- (void)failWithException:(NSException *)exception { }

Чтобы не генерировать исключения, но более простым решением является использование макроса GHAssertTrueNoThrow вместо макроса GHAssertTrue.

...