Swift 5.9宏单元测试:如何使#if canImport(SelfNamedMacros)成立?
解决Swift宏测试中
canImport(SelfNamedMacros)条件不成立的问题 问题根源
Swift宏包默认生成两类测试目标:
- 宿主平台测试目标(命名带
Macros后缀,比如SelfNamedMacrosTests):这类目标会直接链接宏插件,canImport(SelfNamedMacros)条件会成立。 - 跨平台测试目标(命名不带
Macros后缀,比如SelfNamedTests):这类目标仅测试宏的公共接口,不加载宏插件,因此canImport条件始终不成立。
具体解决方法
指定正确的测试目标运行
- 在Xcode的目标选择器中,直接选择
SelfNamedMacrosTests(而非SelfNamedTests)运行测试,此时canImport(SelfNamedMacros)会自动生效,测试会执行宏验证逻辑。 - 用命令行执行测试时,指定宿主测试目标:
swift test --target SelfNamedMacrosTests
- 在Xcode的目标选择器中,直接选择
确认Package.swift中的测试目标配置
检查你的Package.swift,确保宿主测试目标正确依赖宏插件,配置示例如下:testTarget( name: "SelfNamedMacrosTests", dependencies: [ .target(name: "SelfNamedMacros"), .product(name: "SwiftSyntaxMacrosTestSupport", package: "swift-syntax"), ] )可选:调整测试条件(不推荐跨平台测试宏)
若想在跨平台测试中保留条件判断,可补充编译器版本检查,但不建议在跨平台目标中执行宏测试(环境不支持):#if canImport(SelfNamedMacros) && compiler(>=5.9) assertMacroExpansion( """ #stringify(a + b) """, expandedSource: """ (a + b, "a + b") """, macros: testMacros ) #else throw XCTSkip("macros are only supported when running tests for the host platform") #endif
内容的提问来源于stack exchange,提问作者Chris Prince
相关产品推荐
相关产品推荐

