5

テスト ケースで初めて OCMock を使用しようとしています。これは、Xcode 4.3 で構築され、Lion をターゲットとする Mac プロジェクトです。メイン アプリとテスト バンドルの両方で ARC がオンになっているため、テストを実行するたびに次のログ メッセージが表示されます。

GC: forcing GC OFF because OBJC_DISABLE_GC is set

私は ARC を使用しているので、GC は気にしません。OCMock の最新の安定版リリース (2.0.1) にリンクされた単体テストをビルドすると、ビルドに問題はありません。実行時に、上記のログ ステートメントの後、次のようになります。

The test bundle at /Users/___/Library/Developer/Xcode/DerivedData/___-ayizwpehemunvodsdvczckkvarsh/Build/Products/Debug/___Tests.octest could not be loaded because its Objective-C runtime information does not match the runtime information required by the test rig. This is likely because the test rig is being run with Objective-C garbage collection disabled, but the test bundle requires Objective-C garbage collection. To enable Objective-C garbage collection for the test rig, run it in an environment without the OBJC_DISABLE_GC environment variable. 2012-03-06 10:29:32.812 otest[8486:203] *** NSTask: Task create for path '/Users/___/Library/Developer/Xcode/DerivedData/___-ayizwpehemunvodsdvczckkvarsh/Build/Products/Debug/___Tests.octest/Contents/MacOS/___Tests' failed: 22, "Invalid argument". Terminating temporary process.

このメッセージは、ガベージ コレクションが最も一般的な原因であることを示していますが、前述のとおり、GC を使用する方法はありません。では、実行時に私を台無しにする可能性のある他の設定は何ですか? 私は自分が異常なことをしているとは思いませんでした。テスト プロジェクトの設定を確認しましたが、奇妙なことは何もありませんでした。

アップデート

これを新しい空のプロジェクトで再現できました。

  1. 新しいプロジェクトを作成し、ARC を有効にして単体テストを作成する
  2. Test Host単体テスト バンドルのビルド設定から設定をクリアする
  3. OCMock フレームワークへのリンク
  4. テストを実行し、上で報告したのと同じエラーを目撃します

また、ARC をオフにしてガベージ コレクションをRequiredclangすると、mach-o リンカ エラーが報告されるため、ビルドが成功しません。OCMock フレームワークへのリンクを削除すると、正常にビルドされます。これは、ガベージ コレクション以外に問題があるという私の最初の考えを裏付けるものです。

4

1 に答える 1

18

Hamcrest チュートリアル( OCMock.orgからリンクされているOCMock チュートリアルをより注意深く読んでください。そこにも記載されています)で、考えられるすべてを検索して 1 日を過ごした後、答えを見つけました。何らかの理由で、Hamcrest と OCMock のフレームワークを製品ディレクトリにコピーする必要があります。その後、すべてが魔法のように機能します。

  1. テスト バンドルの設定に移動します
  2. [ビルド フェーズ] タブに移動します。
  3. [ビルド フェーズの追加] ボタンをクリックし、[コピー ファイルの追加] を選択します。
  4. 新しいコピー ファイル ビルド フェーズの宛先製品ディレクトリに設定します。
  5. OCMock.framework をプロジェクト アウトラインからフェーズのファイル リストにドラッグします。
  6. ファイルのコピーフェーズをスクリプトの実行フェーズの上にドラッグします。

通常どおりテストを実行します

于 2012-03-07T00:53:08.823 に答える