Тестовая установка вышла ненормально с кодом 134 с проверкой OCMock на iOS 4

Я пытаюсь добавить OCMock в свой проект iOS 4. Чтобы проверить это, у меня есть класс Person одним методом, -hello, Когда я запускаю этот тест:

- (void) testMock {
    id mock = [OCMockObject mockForClass:[Person class]];
    [[mock expect] hello];

    [mock hello];

    [mock verify];
}

Все хорошо, и сборка удалась. Если я заберу hello звоните, вот так:

- (void) testMock {
    id mock = [OCMockObject mockForClass:[Person class]];
    [[mock expect] hello];

    [mock verify];
}

Я ожидаю получить сообщение об ошибке, сообщающее, что мой ожидаемый метод не был вызван на макете. Вместо этого я получаю загадочное сообщение о сбое испытательного стенда:

/Developer/Tools/RunPlatformUnitTests.include:451:0 Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk/Developer/usr/bin/otest' exited abnormally with code 134 (it may have crashed).

Это сбой нормально, когда ожидаемый метод не вызывается? У меня плохая конфигурация?

4 ответа

Решение

У вас нет плохой конфигурации, это ошибка, которую Apple представила в симуляторе SDK, когда они выпустили iOS4. По сути, если код, вызванный с использованием объекта NSInvocation, генерирует исключение, то это исключение невозможно отловить. Я написал о проблеме, когда она впервые появилась здесь:

http://pivotallabs.com/users/adam/blog/articles/1302-objective-c-exceptions-thrown-inside-methods-invoked-via-nsinvocation-are-uncatchable

К сожалению, эта ошибка затрагивает OCMock, и Apple не проявляет особого интереса к ее исправлению. Многие люди подали сообщения об ошибках, но безрезультатно.

Я понимаю, что это немного утешительно, но вы получите несколько лучшие сообщения об ошибках при использовании Cedar для тестирования (я верю, что то же самое верно для GTM).

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

Я обнаружил, что эта ошибка все еще существует в Xcode 4/SDK 4.3 в апреле 2011 года. Например, тест A проходит, тест B дает сбой тестовой установке.

Тест А:

- (void)testAcceptsAndVerifiesExpectedMethods
{

    id mock = [OCMockObject mockForClass:[NSString class]];

    [[mock expect] lowercaseString];
    [mock lowercaseString];

    [mock verify];
}

Тест Б:

- (void)testAcceptsAndVerifiesExpectedMethods
{

    id mock = [OCMockObject mockForClass:[NSString class]];

    [[mock expect] lowercaseString];
    //[mock lowercaseString];

    [mock verify];
}

Обходной путь, который я нашел, - это обернуть вызовы [mockObject verify] и [mockObject verify] вызовами XCTAssertNoThrow, например:

XCTAssertNoThrow([[mockTaskVC expect] showAlertWithTitle:containsString(@"Error") message:OCMOCK_ANY completion:OCMOCK_ANY], @"threw up exception");

Это поймает исключение и провалит текст, а не сбой.

Благодарим автора здесь: http://www.mulle-kybernetik.com/forum/viewtopic.php?f=4&t=315&p=710&hilit=unexpected+method+was+not+invoked+exception

Другие вопросы по тегам