Почему xctool аварийно завершает работу при сопоставлении с NSRegularExpression?

По какой-то странной неизвестной причине этот тест терпит неудачу при запуске в xctool (0.1.16), но проходит, когда я запускаю его через XCode.

- (void)testGetAppleIdfa
{
    NSString *sample_uuid = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

    // For regex pattern matching to verify if it's of UUID
    NSString *pattern = @"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}";
    NSRange searchRange = NSMakeRange(0, [sample_uuid length]);
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
    NSArray *matches = [regex matchesInString:sample_uuid options:0 range:searchRange];

    NSLog(@"UUID generated: %@", sample_uuid);

    XCTAssertEqual([matches count], 1, @"UUID generated doesn't match the UUID RFC");
}

Причина, почему это странно, заключается в том, что я использую точный тот же самый код, но заменяю sample_uuid на [[NSUUID UUID] UUIDString].

Вот что xctool выдает в консоли:

2014-06-19 05:50:25.677 xctest[11190:303] LaunchServices: failed to get advertiserID
Unknown File:0: *** -[NSRegularExpression enumerateMatchesInString:options:range:usingBlock:]: nil argument
(
    0   CoreFoundation                      0x00b331e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x007a68e5 objc_exception_throw + 44
    2   CoreFoundation                      0x00b32fbb +[NSException raise:format:] + 139
    3   Foundation                          0x00079086 -[NSRegularExpression(NSMatching) enumerateMatchesInString:options:range:usingBlock:] + 215
    4   Foundation                          0x00042735 -[NSRegularExpression(NSMatching) matchesInString:options:range:] + 143
    5   SnowplowTests                       0x02f09462 -[TestUtils testGetAppleIdfa] + 338
    6   CoreFoundation                      0x00b2791d __invoking___ + 29
    7   CoreFoundation                      0x00b2782a -[NSInvocation invoke] + 362
    8   XCTest                              0x20103c6c -[XCTestCase invokeTest] + 221
    9   XCTest                              0x20103d7b -[XCTestCase performTest:] + 111
    10  otest-shim-ios.dylib                0x00008cc7 XCPerformTestWithSuppressedExpectedAssertionFailures + 172
    11  otest-shim-ios.dylib                0x00008c15 XCTestCase_performTest + 31
    12  XCTest                              0x20104c48 -[XCTest run] + 82
    13  XCTest                              0x201033e8 -[XCTestSuite performTest:] + 139
    14  XCTest                              0x20104c48 -[XCTest run] + 82
    15  XCTest                              0x201033e8 -[XCTestSuite performTest:] + 139
    16  XCTest                              0x20104c48 -[XCTest run] + 82
    17  XCTest                              0x201033e8 -[XCTestSuite performTest:] + 139
    18  XCTest                              0x20104c48 -[XCTest run] + 82
    19  XCTest                              0x201066ba +[XCTestProbe runTests:] + 183
    20  libobjc.A.dylib                     0x007b8743 +[NSObject performSelector:withObject:] + 70
    21  xctest                              0x0000233e xctest + 4926
    22  xctest                              0x00002590 xctest + 5520
    23  xctest                              0x00002671 xctest + 5745
    24  xctest                              0x00002007 xctest + 4103
    25  libdyld.dylib                       0x01687701 start + 1

):

Из того, что я методом проб и ошибок выяснил, что тест падает в NSArray *matches = [regex matchesInString:sample_uuid options:0 range:searchRange];, когда он вызывает enumerateMatchesInString:options:range:usingBlock:. Опять же, он проходит с другим генератором UUID, который дает точно такой же формат.

Примечания: это не должно совпадать с UUID типа 4, поэтому регулярное выражение такое, какое оно есть.

РЕДАКТИРОВАТЬ: Когда я запускаю xctools с терминала, используя xctool -workspace MyApp.xcworkspace -scheme MyApp -sdk iphonesimulator7.1 build test, я получаю указанную выше ошибку. Однако, когда я запускаю тест через XCode, я получаю свой UUID в NSLog, и он проходит.


person jonalmeida    schedule 19.06.2014    source источник
comment
не удалось получить идентификатор рекламодателя ‹--- Я бы рассмотрел это на вашем месте. Вероятно, из-за этого вы получаете пустую строку.   -  person borrrden    schedule 19.06.2014
comment
Я тоже об этом думал, но трассировка стека немного более странная. Кроме того, я получаю идентификатор рекламодателя, поскольку он работает в среде модульного тестирования в XCode. Разве это не просто xctool с причудливой интеграцией?   -  person jonalmeida    schedule 19.06.2014
comment
Также этот вопрос похож, и человек, который отвечает на него, показывает, что в его тестах получен идентификатор рекламодателя: stackoverflow.com/questions/18022360/   -  person jonalmeida    schedule 19.06.2014
comment
Зарегистрируйте свою строку UUID и посмотрите, что вы получаете для каждого.   -  person borrrden    schedule 19.06.2014
comment
Я использую NSLog(@"UUID generated: %@", sample_uuid);, но когда я запускаю xctools прямо из консоли, он падает, как показано выше, но работает нормально (и показывает мой UUID) в консоли. Я обновлю свой вопрос, чтобы включить это.   -  person jonalmeida    schedule 19.06.2014
comment
Я имею в виду, поместите журнал до, когда он вылетит, очевидно: p он даже говорит, что вы получаете нулевой аргумент.   -  person borrrden    schedule 19.06.2014
comment
Назовите меня глупым... Я получаю (null)   -  person jonalmeida    schedule 19.06.2014


Ответы (2)


Вы должны убедиться, что xctool запускает тот же симулятор, что и Xcode.

Обратите внимание, что вы не указываете какой-либо симулятор в своей команде.

xctool -workspace MyApp.xcworkspace -scheme MyApp -sdk iphonesimulator7.1 build test

потому что команда -sdk используется только при построении, но игнорируется при запуске симулятора.

Вы должны добавить что-то вроде

-destination 'name=iPhone Retina (4-inch 64-bit),OS=7.1'
person Sulthan    schedule 19.06.2014
comment
Я пытался добавить пункт назначения безрезультатно. Как мне узнать точную конфигурацию XCode, чтобы проверить это? - person jonalmeida; 19.06.2014
comment
@jonalmeida Вы всегда знаете, какой симулятор запускаете из Xcode, не так ли? - person Sulthan; 19.06.2014
comment
Да. Я имел в виду, как проверить, добавлены ли какие-либо другие флаги к тому, что XCode выполняет из того, что я выполняю через консоль (помимо параметра назначения). - person jonalmeida; 19.06.2014

От ExtremeMan на Github:

Я смог воспроизвести проблему, о которой вы упомянули. Проблема в том, что Xcode теперь запускает все тесты как тесты приложений, а xctool по-прежнему различает логические тесты и тесты приложений.

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

Более подробную информацию вы можете найти здесь: Что это за сообщение об ошибке vendorID, связанное с сообщением «Не удается подключиться к iTunes для покупки в приложении»?.

person jonalmeida    schedule 21.07.2014