1

我有以下愚蠢的简单测试用例(在带有对应 .h 文件的 .mm 文件中定义)。它使用 boost 尝试从 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 函数什么都不做,并且有一个测试用例也什么也不做。如果我注释掉 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 函数中设置断点,它甚至都不会运行!这是唯一启用的测试,因此即使没有运行单个测试的任何一行,也会发生崩溃。我知道测试设置正确,因为如果我注释掉 read_json 行并设置断点,它确实会到达,我可以在测试用例中包含一些断言,它们会按预期工作。

这也不仅仅是一个提升问题。我最初在从我自己的项目中调用不同的库时遇到了这个问题,但为了简化一切,我只使用了这个 boost 调用。这个完全相同的调用发生在代码的其他部分,所以我很确定我已经正确链接了 boost。我对命名空间非常冗长,所以我认为我没有链接错误版本的函数或其他东西。

我正在运行 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 回答