7

アプリでキーチェーン サービスを使用するために SFHFKeychainUtils を使用しています。このコードの機能を検証するいくつかの OCUnit テストを作成しました。iOS シミュレーターまたはデバイスで Xcode から単体テストを実行すると、すべて正常に動作します。ただし、CI サーバーをセットアップしようとしていますが、コマンド ラインから実行するとエラー コード -25291 でテストが失敗します。Apple のドキュメントを調べると、次のことがわかります。信頼結果がありません (errSecNotAvailable)。Security.framework を単体テスト プロジェクトにリンクしました。Web で読んだ内容から、これを機能させるために必要なのはこれだけのようです。コンソールで呼び出しているコマンドは次のとおりです。

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

コマンドラインからユニットテストとキーチェーンサービスをうまく連携させるための経験や提案はありますか?

4

3 に答える 3

8

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

exec osascript <<EOF

tell application "iOS Simulator"

activate

end tell

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

于 2012-05-31T19:27:32.397 に答える
1

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

テストを進めるために、ユニット テストのターゲットにハックタスティック カテゴリを追加しました。

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

これは良い解決策ではありませんが、より良い解決策が見つかるまで単体テストを機能させるための回避策であることに注意してください。

于 2012-05-14T19:28:50.090 に答える
0

同様の問題が発生しています。私の調査によると、これはテストの実行中に実行されているシミュレーターのバージョンに帰着する可能性があります。iphone Simulator 6.0以降でキーチェーンを単体テストすると、コマンドラインから実行した場合、常にテストが失敗します。他のバージョン(4.3、5.0、5.1)に変更すると、合格します。ただし、どのバージョンでもXCodeから常に優れています。

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

私はここで小さなテストケースで新しい質問を開きました:キーチェーンサービスAPIはiphonesimulator6.0のerrSecNotAvailableで失敗します

于 2012-10-29T10:42:47.083 に答える