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

Swift中如何让MockedWebservice返回不同的条件响应

解决方案

你可以通过「可配置属性+环境变量传参」的方式调整Mock实现,常用的有两种实现方案:

方案1:通过启动环境变量动态控制返回值(最适合UI测试场景)

UI测试执行前可以通过launchEnvironment传递自定义参数,Mock类读取参数后返回对应响应,不需要修改主应用其他逻辑。

第一步:调整MockedWebservice实现

class MockedWebservice: NetworkService {
    // 暴露可配置的登录返回结果,默认返回成功
    var loginResult: Result<LoginResponse?, NetworkError> = .success(LoginResponse(success: true))
    
    func login(username: String, password: String, completion: @escaping (Result<LoginResponse?, NetworkError>) -> Void) {
        completion(loginResult)
    }
}

第二步:修改工厂类,根据环境变量配置Mock结果

你可以新增多个环境变量控制不同接口的返回,比如新增MOCK_LOGIN_SUCCESS控制登录接口是否成功:

class NetworkServiceFactory {
    static func create() -> NetworkService {
        let environment = ProcessInfo.processInfo.environment["ENV"]
        guard let environment = environment, environment == "TEST" else {
            return Webservice()
        }
        let mockService = MockedWebservice()
        // 读取登录接口的模拟返回配置
        if let loginSuccessFlag = ProcessInfo.processInfo.environment["MOCK_LOGIN_SUCCESS"] {
            let isSuccess = (loginSuccessFlag as NSString).boolValue
            if isSuccess {
                mockService.loginResult = .success(LoginResponse(success: true))
            } else {
                // 可以自定义不同错误类型,比如账号密码错误、网络错误等
                mockService.loginResult = .failure(NetworkError.invalidCredentials)
            }
        }
        return mockService
    }
}

第三步:UI测试用例中设置对应的环境变量

在执行不同测试用例前配置需要的参数即可:

// 测试登录失败场景的用例
func testLoginFailure() {
    let app = XCUIApplication()
    app.launchEnvironment["ENV"] = "TEST"
    app.launchEnvironment["MOCK_LOGIN_SUCCESS"] = "false"
    app.launch()
    // 后续执行测试断言
}

// 测试登录成功场景的用例
func testLoginSuccess() {
    let app = XCUIApplication()
    app.launchEnvironment["ENV"] = "TEST"
    app.launchEnvironment["MOCK_LOGIN_SUCCESS"] = "true"
    app.launch()
    // 后续执行测试断言
}

方案2:Mock类支持闭包注入(更灵活,适合复杂模拟场景)

如果需要根据入参返回不同结果(比如特定用户名返回成功、其他返回失败),可以用闭包代替固定属性:

class MockedWebservice: NetworkService {
    // 定义登录模拟闭包,默认返回成功
    var loginHandler: (String, String) -> Result<LoginResponse?, NetworkError> = { _, _ in
        .success(LoginResponse(success: true))
    }
    
    func login(username: String, password: String, completion: @escaping (Result<LoginResponse?, NetworkError>) -> Void) {
        completion(loginHandler(username, password))
    }
}

工厂类中你可以根据环境变量组合不同的闭包逻辑,或者在单元测试中直接修改loginHandler实现自定义模拟逻辑。

内容的提问来源于stack exchange,提问作者Mary Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:06:06