将 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 program
Expanded from macro XCTAssert
Expanded from macro _XCTPrimitiveAssertTrue
以上是关于将 XCTest 与 Objective-C++ 代码一起使用:“Unexpected @ in program”错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 XCTest 测试一个 navigationBar 是不是未在 Objective-C 中设置为特定颜色?
Objective-C 协议在 XCTest 中选择器失败,但在应用程序中失败 [重复]
用于单元测试 Objective-C XCTest 的 .m 文件中的访问变量定义
XCTest:[UIApplication sharedApplication] 返回 nil