将 XCTest 与 Objective-C++ 代码一起使用:“Unexpected @ in program”错误

Posted

技术标签:

【中文标题】将 XCTest 与 Objective-C++ 代码一起使用:“Unexpected @ in program”错误【英文标题】:Using XCTest with Objective-C++ code: "Unexpected @ in program" errors 【发布时间】:2014-12-19 08:49:22 【问题描述】:

我继承了一个包含大量 Objective-C++ 代码且没有单元测试的项目。我正在尝试使用 Xcode 6.1.1 和 XCTest 设置测试。我首先使用默认设置创建了一个新的 Cocoa Touch 单元测试包。

当我创建一个标准的XCTest 子类时,一切正常。然后,当我包含一个 Obj-C++ 文件时,构建阶段会因各种与 C++ 相关的错误而中断。这是可以理解的,因为测试子类需要编译为 Obj-C++ 类。

当我将XCTest 子类从myTests.m 切换到myTests.mm 时,构建阶段再次中断,但这次是

Unexpected '@' in program

显示了两个额外的错误:

Expanded from macro 'XCTAssert'

Expanded from macro '_XCTPrimitiveAssertTrue'

错误是由 XCAssert 调用的 NSString 参数引起的 - 在测试用例中用标准 C 字符串替换它并不能解决问题。

如果我将测试目标的 C++ 标准库从 libstdc++ 切换到 libc++@ 错误就会消失,但是项目其余部分中的 Obj-C++ 代码的编译会失败。

我对 Obj-C++ 的了解不够,无法弄清楚这一点 - 是否需要设置一些额外的编译器标志才能成功使用 XCTest

【问题讨论】:

您使用的是什么版本的 Xcode?我刚刚在 Xcode 6.1.1 中创建了一个新项目,并将 XCTest 子类更改为使用 .mm 作为文件扩展名。编译为 Objective-C++ 就好了。 【参考方案1】:

您确定错误是由您传递的 NSString 引起的吗?您可以通过传递 nil 或将字符串放入变量并传递变量来测试该假设。我问的原因是 _XCTPrimitiveAssertTrue 包含几个 @-prefixed 关键字,似乎可以想象其中一个可能会出错(尽管我不知道为什么)。

此外,看到逐字编译器调用和输出可能会很有启发性(或者没有。我在这里没有做出任何承诺)。

【讨论】:

谢谢 - 我尝试了将 nil 和字符串传递给 XCTAssert 调用的各种组合,但它们都失败了 - 日志中的详细信息是:Unexpected @ in programExpanded from macro XCTAssertExpanded from macro _XCTPrimitiveAssertTrue

以上是关于将 XCTest 与 Objective-C++ 代码一起使用:“Unexpected @ in program”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XCTest 测试一个 navigationBar 是不是未在 Objective-C 中设置为特定颜色?

Objective-C 协议在 XCTest 中选择器失败,但在应用程序中失败 [重复]

用于单元测试 Objective-C XCTest 的 .m 文件中的访问变量定义

XCTest:[UIApplication sharedApplication] 返回 nil

Xcode 7 中的 XCTest:如何验证视图中是不是存在某些文本

是否可以将参数化的测试用例数据与 Xcode 的 XCTest 框架一起使用?