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
相关产品推荐
相关产品推荐

