Тестовая установка вышла ненормально с кодом 134 с проверкой OCMock на iOS 4 - PullRequest
3 голосов
/ 04 августа 2010

Я пытаюсь добавить 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 ]

4 голосов
/ 14 ноября 2010

У вас нет плохой конфигурации, это ошибка, которую 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 ).

2 голосов
/ 07 апреля 2011

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

тест A:

- (void)testAcceptsAndVerifiesExpectedMethods
{

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

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

    [mock verify];
}

Тест B:

- (void)testAcceptsAndVerifiesExpectedMethods
{

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

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

    [mock verify];
}
2 голосов
/ 01 сентября 2010

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

0 голосов
/ 29 апреля 2014

Обходной путь, который я нашел, - это обернуть вызовы [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 = неожиданный + метод + был + не + вызван + исключение # p710

...