更新: あきらめて、代わりに 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");
、クラスがまだインポートされているにもかかわらず、エラーはなくなります。