如何创建UISceneConnectionOptions单元测试并设置其只读属性?
测试SceneDelegate时设置UISceneConnectionOptions的launch URL和source application属性的方法
因为UISceneConnectionOptions的属性都是只读的,直接赋值会报错,你可以通过以下几种方式解决:
方法一:利用KVC修改私有成员变量
虽然属性对外只读,但底层对应的私有实例变量可以通过键值编码(KVC)赋值。注意这种方式依赖系统私有变量命名,后续苹果若修改变量名可能导致测试失效,但单元测试环境下可以临时使用:
Objective-C示例
UISceneConnectionOptions *options = [[UISceneConnectionOptions alloc] init]; // 设置launch URL NSURL *testURL = [NSURL URLWithString:@"test://demo.page"]; UIOpenURLContext *urlContext = [[UIOpenURLContext alloc] initWithURL:testURL options:@{}]; [options setValue:@[urlContext] forKey:@"_URLContexts"]; // 设置source application [options setValue:@"com.test.sourceApp" forKey:@"_sourceApplication"];
Swift示例
let options = UISceneConnectionOptions() // 设置launch URL let testURL = URL(string: "test://demo.page")! let urlContext = UIOpenURLContext(url: testURL, options: [:]) options.setValue([urlContext], forKey: "_URLContexts") // 设置source application options.setValue("com.test.sourceApp", forKey: "_sourceApplication")
方法二:解耦SceneDelegate的业务逻辑(推荐)
把依赖UISceneConnectionOptions的业务逻辑抽离成独立方法,直接接收URL和sourceApp作为参数,这样测试时无需构造完整的UISceneConnectionOptions实例:
重构SceneDelegate
class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UISceneConnectionOptions) { // 从connectionOptions中提取参数,转发给业务方法 let launchURL = connectionOptions.urlContexts.first?.url let sourceApp = connectionOptions.sourceApplication handleLaunch(url: launchURL, sourceApplication: sourceApp) } // 抽离的业务逻辑方法,供测试直接调用 func handleLaunch(url: URL?, sourceApplication: String?) { // 原来处理launch逻辑的代码放到这里 if let url = url { // 处理URL跳转逻辑 } if let sourceApp = sourceApplication { // 处理源应用相关逻辑 } } }
单元测试调用
func testLaunchLogic() { let sceneDelegate = SceneDelegate() // 直接传入测试用的URL和源应用标识 sceneDelegate.handleLaunch(url: URL(string: "test://demo.page"), sourceApplication: "com.test.sourceApp") // 验证业务逻辑是否符合预期 }
这种方式完全不依赖系统私有API,代码解耦后不仅测试更灵活,后续维护也更方便,是长期可行的方案。
内容的提问来源于stack exchange,提问作者Z X
相关产品推荐
相关产品推荐

