5

更新: あきらめて、代わりに GHUnit をプロジェクトに追加しました。ほんの数分で GHUnit を起動して実行することができました。

更新: ここから Xcode プロジェクトをダウンロードできます: http://github.com/d11wtq/Cioccolata

Unit Test ターゲットを Xcode プロジェクトに追加しましたが、ビルド時にフレームワークが見つかりません。

Test.octest could not be loaded because a link error occurred. It is likely that dyld cannot locate a framework framework or library that the the test bundle was linked against, possibly because the framework or library had an incorrect install path at link time.

私のフレームワーク (メイン プロジェクト ターゲット) は、組み込み用に設計されているため、インストール パスは@executable_path/../Frameworks.

フレームワークをテスト ターゲットの直接の依存関係としてマークし、「バイナリとライブラリのリンク」ビルド フェーズに追加しました。

さらに、フレームワークを単体テスト バンドルの Frameworks ディレクトリに単純にコピーする「ファイルのコピー」の最初のステップ (依存関係を構築した後) を追加しました。

誰でもこれについて経験がありますか?何を見逃したのかわかりません。

編集 | フレームワークは実行可能ではないため、そうすべきではないと確信していますが、「テスト ホスト」と「バンドル ローダー」を設定していません。テストバンドルはフレームワークに対してリンクされており、他のバンドルと同じようにロードされるため、これは(私の理解では)すべて問題ありません。

編集 | 私はほとんどそこにいると思います。@executable_path の代わりに @rpath の使用を指示する次の記事を読みました。

http://www.dribin.org/dave/blog/archives/2009/11/15/rpath/

この場合、OCUnit テスト バンドルは実行可能ファイルではなく、単純な古いバンドルであるため、@executable_path は互換性がないため、完全に理にかなっています。これで、フレームワークのインストール ディレクトリが に設定され@rpath、テスト ターゲットのランタイム検索パス (rpath) がビルド ディレクトリとして定義されました。これにより、フレームワークをテスト バンドルにコピーする必要がなくなり、結果として得られるフレームワークはどこにでも配置できるため、全体的にはるかに柔軟になります。

ここで、Test ターゲットに Bundle Loader を設定する必要があることにも気付きました。これは、フレームワーク バイナリのパスに設定されています。

テスト ターゲットをビルドし、エラーなしでフレームワークからクラスを #import できます。しかし、フレームワークからクラスをインスタンス化しようとするとすぐに、次のエラーが発生します。

/Developer/Tools/RunPlatformUnitTests.include:412: note: Started tests for architectures 'i386' /Developer/Tools/RunPlatformUnitTests.include:419: note: Running tests for architecture 'i386' (GC OFF) objc[50676]: GC: forcing GC OFF because OBJC_DISABLE_GC is set Test Suite '/Users/chris/Projects/Mac/Cioccolata/build/Debug/Test.octest(Tests)' started at 2010-05-21 12:53:00 +1000 Test Suite 'CTRequestTest' started at 2010-05-21 12:53:00 +1000 Test Case '-[CTRequestTest testNothing]' started. /Developer/Tools/RunPlatformUnitTests.include: line 415: 50676 Bus error "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}" /Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Developer/Tools/otest' exited abnormally with code 138 (it may have crashed). Command /bin/sh failed with exit code 1

私のテスト メソッドは、このセットアップのデバッグに役立つように作成した HelloWorld クラスを割り当ててから解放するだけです。

- (void)testNothing {
    CTHelloWorld *h = [[CTHelloWorld alloc] init];
    [h release];
}

これらのコード行を に置き換えるとSTAssertTrue(YES, @"Testing nothing");、クラスがまだインポートされているにもかかわらず、エラーはなくなります。

4

6 に答える 6

4

他の誰もこの質問に同意していないので、最後に、SenTestingKit は、私のニーズに対するセットアップの複雑さ (および醜さ) にまったく感銘を受けなかったと言って締めくくります。UI(または必要に応じてコマンドライン)で実行され、すぐに使用できる gdb の使用をサポートする GHUnit を強くお勧めします。プロジェクトで GHUnit をダウンロードして使用するのに数分かかりました。

それもきれいです。Apple は、SenTestingKit IMHO の代わりに Xcode で出荷する必要があります。

于 2010-05-23T22:49:04.383 に答える
3

私は同じ問題を抱えていましたが、Kiwi Unit Testing フレームワークでした。私の問題は、ビルド設定で「テストホスト」が設定されていなかったことです。$(BUNDLE_LOADER) に設定すると、すべてが完全に機能しました。Xcode 4.5.2 iOS SDK 6.0 を使用して検証済み。

于 2012-11-15T07:42:45.687 に答える
2

それは私に数回起こりました。あなたが GHUnit に切り替えたことは知っていますが、誰かが興味を持っている場合に備えて: これを長い間調べた後、Xcode がターゲットのコンパイル部分にコード クラス (.m ファイル) を追加していないことに気付きました。ターゲットのリソースのコピー部分。適切な場所に移動すると、問題が解決しました。

于 2010-09-25T11:22:22.927 に答える
1

次の記事で運が良いかもしれません。特に、実行可能ファイルに DYLD_FRAMEWORK_PATH と DYLD_LIBRARY_PATH を追加すると役立つ場合があります。

于 2010-05-19T16:34:57.787 に答える
1

わかりました、私もこれで戦いました。これが問題の簡単な解決策であることがわかりました。

  1. アプリケーション/フレームワークを作成する
  2. テスト バンドルの「追加ターゲット」を作成します。メインに依存関係を設定しないでください。
  3. テストするファイルをクラスからテスト バンドル ターゲットの「コンパイル ソース」にドラッグします。
  4. テスト ケースを作成し、テスト バンドル ターゲットにのみ追加します。
  5. テストターゲットをコンパイルし、テストを実行します。

これは、テストを実行するときにテスト バンドル ターゲットをコンパイルするだけでよいことを意味します。いいえ、理想的です。はい、動作します。

Apple はこれを実際に自動化し、箱から出してすぐに正しく動作するようにします。

于 2010-10-23T13:17:39.583 に答える
0

私は GHUnit の推奨事項に同意します。

ただし、AppleがxCode4に統合した後、OCTestの使用に切り替えたため、問題を解決していません。

ここで報告されているリンクの問題は、プロジェクトに新しいファイルを追加した後に発生しました。これらには ViewController と xib が含まれていましたが、ファイルはアプリケーションとテスト ターゲットの両方について xcode でマークされていました。派生データ ディレクトリにある OCTest バンドルを調べて、ファイルを発見しました。~/Library/Developer/Xcode/DerivedData/ 右クリックして、ファインダーから「パッケージの内容を表示」を選択します。そこに属さないもの、つまりアプリケーション クラスとリソースを探します。これらのファイルを「コンパイル ソース」または「バンドル リソースのコピー」から削除すると、リンク エラーが修正されました。

于 2011-07-18T04:15:13.140 に答える