1

私のプロジェクトがアプリではなく静的ライブラリであることを除いて、RestKit単体テストガイド(https://github.com/RestKit/RestKit/wiki/Unit-Testing-with-RestKit )に従ってみようとしています。

ここに私が書いたテストがあります:

- (void)testMappingOfDate
{
    id parsedJSON = [RKTestFixture parsedObjectWithContentsOfFixture:@"plan.json"];
    RKMappingTest *test = [RKMappingTest testForMapping:[self planMapping] object:parsedJSON];
    [test expectMappingFromKeyPath:@"plan.date" toKeyPath:@"date"];
    STAssertNoThrow([test verify], nil);
}

テストを実行しようとすると、テストの最初の行で次のエラーが表示されます。

error: testMappingOfDate (api_clientTests) failed: -[NSBundle parsedObjectWithContentsOfResource:withExtension:]: unrecognized selector sent to instance 0x1765c40

RestKit で定義された NSBundle カテゴリが見つからないようですが、テスト ターゲット ヘッダーの検索パスが に設定されており、"$(BUILT_PRODUCTS_DIR)/../../Headers"このパスにNSBundle+RKAdditions.h想定される「認識されないセレクター」が含まれていることを確認しました。

私がここに欠けているものはありますか?

4

2 に答える 2

2

ライブラリから取得したバイナリ内にカテゴリを含めようとしています。これを達成するには、(Unit-Test-Target の) ビルド設定に以下を追加する必要があります。

その他のリンカー フラグ: -ObjC

ここに画像の説明を入力

Apple の QA から:

Objective-C は、各関数 (または Objective-C のメソッド) のリンカー シンボルを定義しません。代わりに、リンカー シンボルは各クラスに対してのみ生成されます。既存のクラスをカテゴリで拡張する場合、リンカーは、コア クラスの実装のオブジェクト コードとカテゴリの実装を関連付けることを認識しません。これにより、結果のアプリケーションで作成されたオブジェクトが、カテゴリで定義されているセレクターに応答しなくなります。

解決:

この問題を解決するには、スタティック ライブラリで -ObjC オプションをリンカーに渡す必要があります。このフラグにより​​、リンカは、Objective-C クラスまたはカテゴリを定義するライブラリ内のすべてのオブジェクト ファイルをロードします。通常、このオプションを使用すると、(アプリケーションに追加のオブジェクト コードが読み込まれるため) 実行可能ファイルが大きくなりますが、既存のクラスのカテゴリを含む効果的な Objective-C 静的ライブラリを正常に作成できます。

于 2012-07-22T20:33:58.547 に答える
1

このエラーは、「認識されないセレクター」の問題が実行時に発生することを意味します。コンパイラと NSBundle+RKAdditions.h は、timr のコンパイル時に発生するこのエラーを発生しません。

問題は、コードが@implementation NSBundle(RKAdditions)アプリにリンクされていないことです。したがって、これをビルドに追加する必要があります

于 2012-07-22T20:16:57.990 に答える