You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:47:20