在运行任何测试代码之前,XCode OCUnit与Abort trap:6崩溃

时间:2012-09-26 04:20:27

标签: objective-c ios xcode ocunit sentestingkit

我有以下愚蠢的简单测试用例(在带有correspong .h文件的.mm文件中定义)。它使用boost来尝试从字符串流中读取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行并设置一个断点,它确实已经到达,我可以在测试用例中包含一些断言,它们按预期工作。

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

我正在运行XCode 4.5(但在4.4.1上遇到同样的问题)并尝试使用OCUnit编写单元测试。我正在开发的项目已经在这个框架中编写了一些单元测试,所有这些测试似乎都能正常工作。

我是Objective C和XCode的新手但是那个设置这个项目的人肯定不是,他看不出我在做什么有任何问题,我们都完全被难倒了。

感谢阅读!如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

如果它获得C ++异常,结果是OCUnit barfs,并且由于某种原因,XCode(或者lldb)没有正确触发断点。 SetUp代码正在运行,调试器无法运行。添加try / catch块或将代码更改为:

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

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

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

不会导致异常并使一切正常。

因此,如果您遇到此问题,解决方法是确保您尝试/捕获测试用例中的所有内容。希望有人能提出更好的答案,因为这似乎是OCunit中一个非常大的错误。