Тесты OCUnit терпят неудачу из командной строки, но работают в Xcode при использовании Keychain Services - PullRequest
7 голосов
/ 03 апреля 2012

Я использую SFHFKeychainUtils для использования Keychain Services в моем приложении. Я написал несколько тестов OCUnit, которые проверяют функциональность этого кода. Все работает нормально, когда я запускаю модульные тесты из Xcode на симуляторе iOS или на моем устройстве. Однако сейчас я пытаюсь настроить сервер CI, и тест не проходит, когда он запускается из командной строки с кодом ошибки -25291. Поиск в документации Apple говорит мне: результаты доверия недоступны (errSecNotAvailable). Я связал Security.framework с моим проектом модульных тестов, и, судя по тому, что я прочитал в Интернете, это все, что мне нужно, чтобы это работало. Вот команда, которую я вызываю в консоли:

/usr/bin/xcodebuild -target [Test_Target] -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/ -configuration Debug

Есть ли у кого-нибудь опыт или предложения для того, чтобы юнит-тестирование и Keychain Services могли хорошо играть вместе из командной строки?

Ответы [ 3 ]

8 голосов
/ 31 мая 2012

Я столкнулся с той же проблемой, и решение для меня состояло в том, чтобы удостовериться, что симулятор работает перед началом любого теста. Я сделал это, используя AppleScript на этапе сборки Run Script в Xcode, и по сути то же самое на CI-сервере. Вот скрипт оболочки, который откроет симулятор:

exec osascript <<EOF

tell application "iOS Simulator"

activate

end tell

Проблема служб безопасности / связки ключей, которая вызывает это, по-видимому, известная проблема, хотя у меня еще нет радара, который отслеживает ее. Если вы используете Jenkins, поместите приведенный выше скрипт в фазу Execute Shell перед фазой сборки Xcode. Если вы управляете этим через сам Xcode, поместите его в фазу сборки Run Script перед фазой сборки RunUnitTests Run Script. Надеюсь, что это решит вашу проблему!

1 голос
/ 14 мая 2012

Мне не удалось выяснить, почему не удается получить доступ к цепочке для ключей, когда тесты OCUnit запускаются из командной строки.

Чтобы продолжить тестирование, я добавил категорию хакетических атак в свою цель модульного теста:

//
//  SFHFKeychainUtils+UnitTestHacks.m
//  CB30
// 
// GRRR!!! /8261725/testy-ocunit-terpyat-neudachu-iz-komandnoi-stroki-no-rabotayt-v-xcode-pri-ispolzovanii-keychain-services
//
//  Created by Joshua Vickery on 5/14/12.
//

#import "SFHFKeychainUtils+UnitTestHacks.h"

static NSMutableDictionary *fakeKeyChainHolder;

@implementation SFHFKeychainUtils (UnitTestHacks)

+ (NSMutableDictionary *)fakeKeyChainForServiceName:(NSString *)serviceName {
    if (nil == fakeKeyChainHolder) {
        fakeKeyChainHolder = [NSMutableDictionary dictionary];
    }

    NSMutableDictionary *fakeKeyChain = [fakeKeyChainHolder objectForKey:serviceName];
    if (nil == fakeKeyChain) {
        fakeKeyChain = [NSMutableDictionary dictionary];
        [fakeKeyChainHolder setObject:fakeKeyChain forKey:serviceName];
    }
    return fakeKeyChain;
}

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

+ (BOOL) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error 
{
    [[self fakeKeyChainForServiceName:serviceName] removeObjectForKey:username];
    return YES;
}


+ (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error 
{
    [[self fakeKeyChainForServiceName:serviceName] setObject:password forKey:username];
    return YES;
}

+ (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error 
{
    return [[self fakeKeyChainForServiceName:serviceName] objectForKey:username];
}

#pragma clang diagnostic pop

@end

Обратите внимание, что это не хорошее решение, а обходной путь, позволяющий запустить модульные тесты, пока не будет найдено лучшее решение.

0 голосов
/ 29 октября 2012

У меня похожая проблема.Из моих исследований это может быть связано с версией симулятора, которая работает во время выполнения тестов.Модульное тестирование брелка с включенным iphone simulator 6.0 всегда приводит к неудаче моих тестов, если они запускаются из командной строки.Поменяйте его на любую другую версию (4.3, 5.0, 5.1) и они пройдут.Всегда хорошо работает с XCode с любой версией.

Возможно, это проблема инструментов командной строки, которая не устанавливает некоторые необходимые флаги перед запуском тестов.

Я открыл новый вопрос здесь снебольшой тестовый пример: API служб цепочки ключей завершается ошибкой с errSecNotAvailable в iphonesimulator 6.0

...