我已将测试(XCTests)添加到Xcode 5中的现有C ++命令行应用程序
.mm
,所有编译都很好。现在运行测试只会给我一个“测试失败”消息,控制台中没有任何内容,导航器中既没有绿灯也没有红灯(即没有执行测试)。
从一个全新的Xcode 5项目开始,并将测试类的扩展名更改为.mm
只是工作正常,所以我认为它不仅仅是在XCTest中缺乏对Objective-C ++的支持。
即使在现有C ++项目中添加了普通的vanilla测试目标,测试也会在运行之前失败。
在将XCTests添加到现有(Objective-)C ++目标时需要注意什么?
更新#1
使用Xcode 5.0.2(在10.8.5上)xctest现在在同一场景中崩溃
*** NSTask: Task create for path '/Users/XXX/Library/Developer/Xcode/DerivedData/RM_Next_Gen-gpihzjouhxvifqcslmywktktizer/Build/Products/Debug/YYY Tests.xctest/Contents/MacOS/YYY Tests' failed: 22, "Invalid argument". Terminating temporary process.
objc[3478]: GC: forcing GC OFF because OBJC_DISABLE_GC is set
*** multi-threaded process forked ***
答案 0 :(得分:4)
原来这是一个命令行C ++项目,显然目前XCTest不支持。从Objective-C(++)项目测试C ++代码就可以了。
希望在(近)未来的某个时刻更好地记录XCTest。
答案 1 :(得分:3)
我找不到任何关于使用XCTest来测试非Objective C(C / C ++)代码的文档。我想测试命令行C项目,我担心你的答案表明Xcode不支持这样做。我是XCTest和TDD的新手,但我认为其他人可能会欣赏我发现的东西。
我创建了一个新项目>命令行工具,基于C.项目称为 foo ; Xcode默认也会调用目标 foo 。
- 创建的文件:main.c
转到Test Navigator>添加测试目标(+)>新的测试目标。调用目标 fooTests 。 Xcode将在其中创建此目标和示例测试(所有文件都在名为fooTests.m的文件中)。示例测试将被称为testExample,它将包含以下测试函数:
- (void)testExample
{
XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
}
如果您现在运行测试(从产品>测试菜单项或⌘U),测试将失败(它应该)。为了简洁起见,我不会完成TDD循环,只需列出需要添加到不在Objective-C类中的测试函数的文件和内容。
假设我们有一个我们想要测试的函数,名为 bar(),并从main.c调用。转到项目文件资源管理器并添加一个名为bar.h的新头文件。添加函数原型:
int bar();
如果要使用XCTest测试函数,则不能在main.c中,因此将其添加到名为 bar.c 的新C源文件中。重要提示:添加文件时,必须将其添加到目标foo 和 fooTests 。如果你没有将它添加到fooTests,那么在编译测试时,链接器将找不到该函数。
int bar() {
return 0;
}
在fooTests.m中,添加include:
#include "bar.h"
您现在可以在测试中引用bar.h中包含的任何函数。现在创建2个单元测试,一个将失败,另一个将通过。
删除方法testExample并替换为以下代码:
- (void)testBarWillFail
{
int rc = bar();
XCTAssertTrue(rc == -1, @"Expected rc==-1, rc==%d", rc);
}
- (void)testBarWillPass
{
int rc = bar();
XCTAssertTrue(rc == 0, @"Expected rc==0, rc==%d", rc);
}
运行测试将在调试窗口中生成以下内容:
Test Suite 'All tests' finished at 2014-01-12 13:38:45 +0000.
Executed 2 tests, with 1 failure (0 unexpected) in 0.000
在“问题导航器”窗格中,您将看到:
file: /foo/fooTests/fooTests.m: test failure: -[fooTests testBarWillFail] failed: ((rc == -1) is true) failed - Expected rc==-1, rc==0
这一切都符合预期!使用您要测试的所有其他C代码重复此过程。
如果有人知道更好的方法,那么我很高兴听到它!