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

如何创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:13:19