7

Ich verwende SFHFKeychainUtils, um die Schlüsselbunddienste in meiner App zu verwenden. Ich habe einige OCUnit-Tests geschrieben, die die Funktionalität dieses Codes überprüfen. Alles funktioniert gut, wenn ich die Komponententests von Xcode auf dem iOS-Simulator oder meinem Gerät starte. Jetzt versuche ich jedoch, einen CI-Server einzurichten, und der Test schlägt fehl, wenn er über die Befehlszeile mit dem Fehlercode -25291 ausgeführt wird. Ein Blick in die Dokumentation von Apple zeigt mir: Es sind keine Vertrauensergebnisse verfügbar (errSecNotAvailable). Ich habe das Security.framework mit meinem Komponententest-Projekt verknüpft, es scheint, als ob von dem, was ich im Web gelesen habe, das alles ist, was ich brauche, damit das funktioniert. Hier ist der Befehl, den ich in der Konsole am Aufruf:OCUnit-Tests schlagen über die Befehlszeile fehl, funktionieren aber in Xcode, wenn Keychain Services verwendet wird

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

Hat jemand Erfahrung oder Anregungen für das Erhalten Unit-Tests und Schlüsseldienste gut zusammen aus der Befehlszeile zu spielen?

+0

Sie den CI-Server in Headless Modus ausgeführt ist, oder Sie haben eine aktive Benutzersitzung? –

+0

Ich habe eine aktive Benutzersitzung. –

+0

Sehr merkwürdig, können Sie bestätigen, dass Sie Zugang zum Schlüsselbund haben, d. H. Es ist nicht passwortgeschützt? –

Antwort

8

Ich stieß auf das gleiche Problem, und die Lösung für mich war, sicherzustellen, dass der Simulator lief, bevor Sie einen Test starten. Ich habe das mit AppleScript in einer Run Script-Build-Phase in Xcode gemacht, und im Wesentlichen die gleiche Sache auf dem CI-Server. Hier ist der Shell-Skript, das den Simulator öffnen:

exec osascript <<EOF

tell application "iOS Simulator"

activate

end tell

Die Sicherheit/keychain Dienste Problem, das verursacht dies ist offenbar ein bekanntes Problem, obwohl ich noch nicht das Radar habe, das es verfolgt. Wenn Sie Jenkins verwenden, fügen Sie das obige Skript vor der Xcode-Erstellungsphase in eine Shell ausführen-Phase ein. Wenn Sie dies über Xcode selbst steuern, sollten Sie es in eine Run Script-Build-Phase vor der Run Run Script-Erstellungsphase RunUnitTests einfügen. Hoffe, dass Ihr Problem gelöst wird!

+0

DANKE. Es dauerte eine Stunde meiner Zeit, bevor ich das Problem googlen. Das Skript funktionierte genau so, wie Sie es vorgeschlagen hatten. – makdad

+0

Quälisch - Sie möchten vielleicht das WaxSim-Projekt auschecken. Dadurch können Sie den Simulator über die Befehlszeile starten. https://github.com/square/WaxSim/ - Sie können auch Folgendes verwenden, um alle aktiven Sims 'ps aux | grep -e 'iPhone Simulator.app' | grep -v grep | awk '{print $ 2}' | xargs kill -9 ' –

+1

@stuart ... anstelle der komplexen grep und aux lösung ... sollten sie in der lage zu verwenden "killall -9' iPhone Simulator '" –

1

Ich konnte nicht herausfinden, warum Keychain-Zugriff fehlschlägt, wenn OCUnit-Tests über die Befehlszeile ausgeführt werden.

Um mit meinen Tests fortfahren habe ich eine hacktastic Kategorie zu meiner Einheit Testziel:

// 
// SFHFKeychainUtils+UnitTestHacks.m 
// CB30 
// 
// GRRR!!! http://stackoverflow.com/questions/9996578/ocunit-tests-fail-from-the-command-line-but-work-in-xcode-when-using-keychain-se 
// 
// 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 

Bitte beachten Sie, dass dies keine gute Lösung ist aber eine Behelfslösung, bis ein Arbeits Unit-Tests zu erhalten bessere Lösung gefunden.

+1

Ich denke immer noch in einer Weise, dass diese * IS * eine gute Lösung ist, weil Sie effektiv das Framework verspotten, nie eine schlechte Sache in einem Unit Test .. – makdad

0

Ich habe ein ähnliches Problem. Aus meiner Forschung könnte dies auf die Simulatorversion zurückzuführen sein, die ausgeführt wird, wenn die Tests ausgeführt werden. Unit Test Keychain mit Iphone Simulator 6.0 up wird immer meine Tests fehlschlagen, wenn von der Kommandozeile ausgeführt wird. Ändern Sie es in eine andere Version (4.3, 5.0, 5.1) und sie bestehen. Immer gut von XCode mit jeder Version.

Vielleicht ist dies ein Kommandozeilen-Tool-Problem, das einige notwendige Flags vor dem Ausführen von Tests nicht einrichten.

Ich öffnete eine neue Frage hier mit einem kleinen Testfall bis: Keychain Services API fails with errSecNotAvailable in iphonesimulator 6.0

Verwandte Themen