Xcode UI测试:覆盖含空格的User Defaults键及临时删除默认值
解决Xcode UI测试中带空格的UserDefaults键设置及临时删除问题
一、设置带空格的UserDefaults键
你之前尝试转义或引号包裹的方式不生效,是因为XCUIApplication.launchArguments是数组类型,每个元素会被当作独立的命令行参数传递。正确的做法是直接把带空格的键(前缀加-)作为数组的一个元素,值作为下一个元素,无需额外转义:
var app = XCUIApplication() // 直接将带空格的键完整作为一个launch argument元素 app.launchArguments += ["-NSSplitView Subview Frames someSplitView", "目标值"] app.launch()
UserDefaults会正确识别这个带空格的键,因为命令行参数解析时,会将-开头的完整字符串作为键,后续元素对应其值。
二、临时删除UserDefaults的最优方案
推荐通过测试专用启动参数触发App内部清理的方式,避免依赖不同平台的文件路径差异,更可靠通用:
1. 在App代码中添加清理逻辑(仅Debug模式生效)
在App的AppDelegate或SceneDelegate(根据项目架构)的初始化方法中,检测测试专用启动参数,触发UserDefaults清理:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { #if DEBUG // 检测是否携带重置参数 if CommandLine.arguments.contains("-resetUserDefaults") { guard let bundleID = Bundle.main.bundleIdentifier else { return true } UserDefaults.standard.removePersistentDomain(forName: bundleID) UserDefaults.standard.synchronize() } #endif // 其他业务初始化代码 return true }
2. 在UI测试中触发清理
启动App前添加该启动参数即可:
var app = XCUIApplication() app.launchArguments += ["-resetUserDefaults"] app.launch()
如果不想修改App代码,也可以直接删除UserDefaults对应的plist文件,但需要注意不同平台的路径差异:
var app = XCUIApplication() guard let bundleID = app.bundleIdentifier else { fatalError("无法获取Bundle ID") } // iOS平台的UserDefaults文件路径 let defaultsURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask) .first? .appendingPathComponent("Preferences") .appendingPathComponent("\(bundleID).plist") // macOS平台路径需替换为沙盒容器路径: // let defaultsURL = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask) // .first? // .appendingPathComponent(bundleID) // .appendingPathComponent("Preferences/\(bundleID).plist") try? FileManager.default.removeItem(at: defaultsURL!) app.launch()
这种方式需要针对不同平台调整路径,不如第一种方法通用。
内容的提问来源于stack exchange,提问作者Nickkk
相关产品推荐
相关产品推荐

