2012-03-06 12 views
5

テストケースで初めてOCMockを使用しようとしています。これはXcode 4.3で作成され、LionをターゲットにしたMacプロジェクトです。メインアプリとテストバンドルは、両方のARCをオンにし、しているので、私は、私は次のログメッセージを参照してください。テストを実行するたび:OCMock実行時にエラーが発生する

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. クリアOCMockフレームワーク
  3. から
  4. リンクテストを実行し、ユニットテストバンドルのビルド設定からTest Host設定を有効にして、私はARCをオフにしてから、ガベージコレクション必須を作る
  5. また

、上に報告された同じエラーを目撃はmach-oリンカエラーを報告するため、ビルドは成功しません。 OCMockフレームワークへのリンクを削除すると、うまく構築されます。これは、ガベージコレクション以外の場所に問題があるという私の最初の考えを支持しています。

+0

いつものようにテストを実行し、位相用のファイルのリストにプロジェクトのアウトラインからのフレームワーク

  • ドラッグそれはおそらくGCので、働いていないと言いますOFFです。 "テストバンドルにはObjective-Cガベージコレクションが必要です"。 OBJC_DISABLE_GCを設定しないでください。 – vakio

  • +0

    @vakio "テストバンドル"は私自身のテストコードで、ARCを使用しています。これがGCが無効になっている理由です。このメッセージは、通常は実行時環境で間違っていることを示唆しています。私はGCを有効にしようとしましたが、おそらくARCとGCが共存できないため、LLVMが失敗します。 – Dov

    答えて

    18

    私はHamcrest tutorialに(OCMock.orgからリンクされているOCMock tutorialを通じて、より慎重に読ん、それはあまりにも、が挙げています)。、私は考えることができるすべてを検索する日後に、答えを見つけました何らかの理由で、HamcrestとOCMockのフレームワークをproductsディレクトリにコピーする必要があります。それですべては魅力のように機能します。あなたのテストのための設定に

    1. Goがビルドフェーズタブ
    2. ゴーバンドルはビルドフェーズボタンを追加し、ファイルのコピーに新しいを設定
    3. を追加を選択しますコピーファイルのビルドフェーズ '宛先製品ディレクトリ
    4. OCMockをドラッグします。スクリプトの実行

    上記のファイルのコピー・フェーズが

    +1

    OCHamrestとOCMockの両方は、ローダーパスに '@ rpath'で構築されています。これにより、デフォルトでパス上にあるので、productsディレクトリ内で動作します。 'LC_RPATH'やその他の手段を使って柔軟性を高めることができます。 'dyld'のmanページの' @ rpath'の議論を参照してください。 –

    +0

    面白い、説明のおかげで。 – Dov

    +0

    私はGrowlフレームワークを含む私のプロジェクトで同じ問題を抱えていました。解決策は同じでした、ありがとう! – mrwalker

    関連する問題