1

次のばかげた単純なテスト ケースがあります (対応する .h ファイルを含む .mm ファイルで定義されています)。ブーストを使用して、stringstream から ptree を読み取ろうとし、ファイルに含まれるテキストをシミュレートします。

-(void)setUp {
  printf("setup\n");

  ::std::stringstream ss;
  ss << "bad format text";

  _configuration = new ptree();
  ::boost::property_tree::read_json(ss, *_configuration);
}

tearDown 関数は何もしません。また、何もしないテスト ケースが 1 つあります。read_json 行をコメントアウトすると、すべて正常に動作します。しかし、そのまま実行すると、次のようになります。

Test Case '-[TestPlanner testPlanner]' started.
libc++abi.dylib: terminate called throwing an exception
/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include: line 415:  3320 Abort trap: 6           "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}"
/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/Developer/usr/bin/otest' exited abnormally with code 134 (it may have crashed).

本当におかしなことは、SetUp 関数にブレークポイントを設定しても実行されないことです。これは有効な唯一のテストであるため、1 つのテストの 1 行も実行しなくても、何かがクラッシュします。read_json 行をコメントアウトしてブレークポイントを設定すると、それに到達し、テスト ケースにいくつかのアサートを含めることができ、期待どおりに動作するため、テストが正しく設定されていることがわかります。

ブーストの問題だけではありません。私はもともと自分のプロジェクトから別のライブラリを呼び出すときにこれに遭遇しましたが、すべてを単純化するために、このブースト呼び出しだけに行きました. これとまったく同じ呼び出しがコードの他の部分で発生しているため、ブーストが正しくリンクされていると確信しています。私は名前空間について非常に冗長だったので、間違ったバージョンの関数などをリンクしているとは思いません。

XCode 4.5 を実行していますが (4.4.1 でも同じ問題があります)、OCUnit を使用して単体テストを作成しようとしています。私が取り組んでいるプロジェクトには、このフレームワークで書かれたいくつかの単体テストが既にあり、それらのテストのすべてが正常に機能しているようです。

私は Objective C と XCode は初めてですが、このプロジェクトをセットアップした人は間違いなくそうではなく、彼は私がやっていることに何の問題も見られず、私たちはまったく困惑していました。

読んでくれてありがとう!さらに情報が必要な場合はお知らせください。

4

1 に答える 1

0

C++ 例外が発生すると OCUnit barfs になり、何らかの理由で XCode (またはおそらく lldb) がブレークポイントを適切にトリガーしません。セットアップ コードは実行されていますが、デバッガーは動作していません。try/catch ブロックを追加するか、コードを次のように変更します。

-(void)setUp {
  printf("setup\n");

  ::std::stringstream ss;
  ss << "{}";

  _configuration = new ptree();
  ::boost::property_tree::read_json(ss, *_configuration);
}

例外は発生せず、すべてが機能します。

したがって、この問題が発生した場合の回避策は、テスト ケースのすべてを試してキャッチすることです。これはOCunitのかなり大きなバグのように思えるので、誰かがより良い答えを思いつくことを願っています.

于 2012-09-27T00:51:28.047 に答える