Проблема с модульными тестами в Xcode 5.1/iOS 7.1: ошибка утверждения в BKSEventFocusManager

Увидев следующую ошибку при запуске логических тестов на основе XCTest после обновления до Xcode 5.1, хотелось бы узнать об обходном пути.

2014-03-11 12:57:42.258 xctest[25605:303] deferral properties must have a 
clientID 2014-03-11 12:57:42.258 xctest[25605:303] ***
Assertion failure in -[BKSEventFocusManager
deferEventsForClientWithProperties:toClientWithProperties:],
/SourceCache/BackBoardServices_Sim/SpringBoard-2618.99.15/megatrond/BKSEventFocusManager.m:63
<unknown>:0: error: -[CSAPIErrorHandlerTests testDisplayReachabilityAlert] : 
props must have a valid clientID (  
0   CoreFoundation      0x00b251e4 __exceptionPreprocess + 180  
1   libobjc.A.dylib     0x007988e5 objc_exception_throw + 44    
2   CoreFoundation      0x00b25048 +[NSException raise:format:arguments:] + 136     
3   Foundation          0x000114de -[NSAssertionHandler
    handleFailureInMethod:object:file:lineNumber:description:] + 116    
4   BackBoardServices   0x0197fece -[BKSEventFocusManager
    deferEventsForClientWithProperties:toClientWithProperties:] + 154   
5   UIKit               0x07a942e1 -[UIWindow _beginKeyWindowDeferral] + 176    
6   UIKit               0x07a940a7 -[UIWindow _makeKeyWindowIgnoringOldKeyWindow:] + 129    
7   UIKit               0x07a9400d -[UIWindow makeKeyWindow] + 41   
8   UIKit               0x07a943e2 -[UIWindow makeKeyAndVisible] + 91

person gemmakbarlow    schedule 11.03.2014    source источник
comment
у меня такая же проблема с 5.1   -  person Andreas Prang    schedule 12.03.2014
comment
я тоже это вижу   -  person pxpgraphics    schedule 18.03.2014


Ответы (2)


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

#import <XCTest/XCTest.h>

@interface DummyTest : XCTestCase

@end

@implementation DummyTest

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title"
                                                    message:@"Message"
                                                   delegate:nil
                                          cancelButtonTitle:@"Cancel"
                                          otherButtonTitles:nil];

    // Commenting out the next row does not cause the problem
    [alert show];

    XCTAssertTrue(YES);
}

@end

Похоже, что отображение UIAlertView в тесте вызывает эту проблему. Это работало в Xcode 5.0, но не работает в Xcode 5.1.

  • Xcode Версия 5.1 (5B130a)
  • OSX Версия 10.9.2

Если у вас возникла эта проблема, попробуйте приведенный выше код и посмотрите, воспроизводится ли он.

person Hugo Tunius    schedule 18.03.2014
comment
Это именно то, что я нашел прошлой ночью в моем проекте. Используемый метод содержит UIAlertView. - person pxpgraphics; 18.03.2014
comment
Хороший. Я убедился, что я все еще работаю над Xcode 5.0.2, и это не вызывает проблем, когда тесты выполняются на Travis-CI. Я сообщил об ошибке в Apple - person Hugo Tunius; 18.03.2014
comment
Хороший! Я указал обходной путь выше, если вы используете макеты в своем проекте :) Вы привели меня в правильном направлении! - person pxpgraphics; 18.03.2014
comment
Использование OCMockito, который не может справиться с этим продвинутым издевательством над тем, что я знаю - person Hugo Tunius; 18.03.2014
comment
Ознакомьтесь с репозиторием модульного тестирования UIAlertView и UIActionSheet Джона Рейда. - person pxpgraphics; 18.03.2014

Я использую Kiwi BDD для запуска своих тестовых случаев (называемых Specs в Kiwi). Я смог заставить замолчать этот сбой утверждения, смоделировав UIAlertView, заглушив метод -show и используя макет для завершения тестового метода.

Вот пример моего кода:

[[UIAlertView alloc] stub:@selector(show)];
[[[UIAlertView alloc] should] receive:@selector(initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:)];
[[[UIAlertView alloc] should] receive:@selector(show)];
[sut methodYouWantToTest]; // sut => system under test (self)

Редактировать: я также избежал ошибки утверждения, сделав UIAlertView свойством UIViewController.

[sut methodYouWantToTest];
[[[sut alertView] shouldNot] beNil];
[[[[sut alertView] title] shouldNot] beNil];
[[[[sut alertView] message] shouldNot] beNil];
person pxpgraphics    schedule 18.03.2014