测试Swift宏遇重复诊断问题:是Bug还是操作有误?
Swift宏测试重复诊断信息问题
我正在尝试Swift宏,已观看WWDC 23的两场相关主题会议:《Write Swift macros》和《Expand Swift macros》。在测试自定义URLMacro时发现,Xcode编译器仅显示1个预期错误,但测试代码中diagnostics却收到2条完全相同的诊断信息,需添加两个相同的DiagnosticSpec才能让测试通过。使用环境为Xcode 15 - Beta 6,请问这是Bug还是我的操作存在问题?
相关代码
自定义宏实现
public struct URLMacro: ExpressionMacro { public static func expansion(of node: some FreestandingMacroExpansionSyntax, in context: some MacroExpansionContext) throws -> ExprSyntax { throw URLMacroError.invaldURL } }
客户端测试代码
let url = #URL("")
测试用例代码
func testInvalidURL() { assertMacroExpansion( #""" #URL("") """#, expandedSource: #""" #URL("") """#, diagnostics: [ DiagnosticSpec(message: "The input URL is invalid", line: 1, column: 1) ], macros: testMacros) }
测试失败提示
failed - Expected 1 diagnostics but received 2: 1:1: #URL The input URL is invalid 1:1: #URL The input URL is invalid
问题分析与解决
这大概率是Xcode 15 Beta版本的已知Bug,而非你的操作问题。Beta版本的Swift宏测试框架在处理宏抛出的错误时,存在重复上报诊断信息的情况。
可以尝试以下几种方式验证或处理:
- 检查
URLMacroError的实现,确认错误抛出逻辑没有重复触发的情况(比如是否在多个分支或回调中抛出了同一错误)。 - 更新到最新的Xcode 15 Beta版本,后续迭代的Beta版通常会修复这类测试框架的细节问题。
- 临时在测试用例中添加两个相同的
DiagnosticSpec来适配当前Beta版本的行为,等Xcode 15正式版发布后再调整回预期的单个诊断配置。
另外,Xcode编译器界面只显示一个错误是正常行为——编译器会自动合并重复的诊断信息,但测试框架的断言机制会直接统计原始上报的诊断数量,因此出现了测试结果与界面显示不一致的差异。
内容的提问来源于stack exchange,提问作者Robert Clegg
相关产品推荐
相关产品推荐

