Тестовая установка вышла ненормально с кодом 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, генерирует исключение, то это исключение невозможно отловить. Я написал о проблеме, когда она впервые появилась здесь:
К сожалению, эта ошибка затрагивает 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