Почему происходит сбой 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, и он проходит.
2 ответа
Из ExtremeMan на Github:
Я смог воспроизвести проблему, которую вы упомянули. Проблема в том, что Xcode теперь запускает все тесты как тесты приложений, а xctool по-прежнему различает тесты логики и приложений.
Я смог выполнить ваш тест, когда пакет тестов связал приложение, и поэтому он рассматривался как тест приложения.
Более подробную информацию вы можете найти здесь: Что это за сообщение об ошибке vendorID, связанное с "Cannot Connect to iTunes" для покупки в приложении?,
Вы должны убедиться, что 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'