7

SFHFKeychainUtilsを使用してアプリケーションでキーチェーンサービスを使用しています。私は、このコードの機能を検証するいくつかのOCUnitテストを作成しました。 iOSシミュレータまたはデバイスのXcodeから単体テストを実行すると、すべてうまく動作します。しかし、今はCIサーバーをセットアップしようとしていますが、エラーコード-25291でコマンドライン経由でテストを実行するとテストが失敗します。アップルのドキュメントでこれを確認すると、信頼できる結果が得られません(errSecNotAvailable)。私はSecurity.frameworkを私の単体テストプロジェクトにリンクしました。これはWeb上で読んだことのように思えますが、これは私がこの作業をするために必要なものです。ここでのコマンドは、私は、コンソールで起動していますされていますOCUnitテストはコマンドラインから失敗しますが、キーチェーンサービスを使用する場合はXcodeで動作します

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

誰でもコマンドラインから一緒にきれいに再生するには、ユニットテストやキーホルダーサービスを取得するための任意の経験や提案を持っていますか?

+0

あなたがヘッドレスモードでのCIサーバを実行しています、またはあなたは、アクティブなユーザセッションを持っていますか? –

+0

私はアクティブなユーザーセッションを持っています。 –

+0

キーチェーンにアクセスできることを確認できますか?パスワード保護されていません。 –

答えて

8

私は同じ問題に遭遇しました。私の解決策は、テストを開始する前にシミュレータが実行されていることを確認することでした。私はXcodeのRun Scriptビルド段階でAppleScriptを使用していましたが、基本的にCIサーバーでも同じことをしました。ここでは、シミュレータを開きますシェルスクリプトは次のとおりです。

exec osascript <<EOF

tell application "iOS Simulator"

activate

end tell

これが発生したセキュリティ/キーチェーンサービスの問題は、明らかに既知の問題です私はまだそれを追跡するレーダーを持っていない。 Jenkinsを使用している場合は、上記のスクリプトをExecute Shellフェーズに入れてからXcodeビルドフェーズを実行してください。これをXcode自体で制御している場合は、RunUnitTests Run Scriptビルドフェーズの前にRun Scriptビルドフェーズに配置します。 あなたの問題を解決することを願っています!

+0

ありがとうございます。問題をグーグルで調べるまでには1時間ほどかかりました。スクリプトは、あなたが提案したのとまったく同じように機能しました – makdad

+0

Quellish - WaxSimプロジェクトをチェックアウトすることができます。これにより、コマンドラインからシミュレータを起動することができます。 https://github.com/square/WaxSim/ - また、次のコマンドを実行して、アクティブなシムを削除することもできます。ps aux | grep -e 'iPhone Simulator.app' | grep -v grep | awk '{print $ 2}' | xargs kill -9 ' –

+1

@stuart ...複雑なgrepとauxソリューションの代わりに... "killall -9' iPhone Simulator '" –

1

OCUnitテストをコマンドラインから実行すると、キーチェーンアクセスが失敗する理由を特定できませんでした。

私のテストを続行するために、私はユニットテストの対象にhacktasticカテゴリを追加しました:

// 
// 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 

これはユニットテストがまで働いて得るための良い解決策が、回避策はありませんのでご注意くださいよりよい解決策が見出される。

+1

私はまだこの方法が*良いと思っています。フレームワークを効果的に模倣しているので、単体テストで悪いことはありません。 – makdad

0

同様の問題が発生しています。私の研究では、これはテストが実行されているときに実行されているシミュレータのバージョンになる可能性があります。 iphone simulator 6.0を使ったユニットテスト用キーチェーンは、コマンドラインから実行していると、常にテストに失敗します。それを他のバージョン(4.3、5.0、5.1)に変更してください。 XCodeはいつもどんなバージョンでも良い。

これはテストを実行する前にいくつかの必要なフラグを設定していないコマンドラインツールの問題かもしれません。

は、私は小さなテストケースとここに新しい質問を開い:Keychain Services API fails with errSecNotAvailable in iphonesimulator 6.0

関連する問題