如何在Combine中配置Mock服务返回错误以测试错误处理流程
实现方案
给PostsServiceMock新增一个可选的错误存储属性,调用getPosts时优先判断该属性是否有值:如果存在就返回错误响应,否则返回预设的Mock帖子列表。同时要在reset方法中加入该属性的重置逻辑,避免跨测试用例的状态污染。
修改后的完整代码如下:
class PostsServiceMock: PostsServiceProtocol { var posts: [Post] = [.mock()] var getPostsCallCount = 0 // 新增:自定义要返回的错误,为nil时返回正常数据 var customError: APIError? func getPosts() -> AnyPublisher<[Post], APIError> { getPostsCallCount += 1 // 优先判断是否要返回错误 if let error = customError { return Fail(error: error) .eraseToAnyPublisher() } else { return Just(posts) .setFailureType(to: APIError.self) .eraseToAnyPublisher() } } func reset() { getPostsCallCount = 0 // 重置时清空自定义错误,默认回到返回正常数据的状态 customError = nil } }
使用示例
- 测试正常业务流程:不需要额外设置,默认返回预设的
posts数组即可 - 测试错误处理流程:执行测试前给
customError赋值对应错误即可,示例:
// 测试网络异常场景 let mockService = PostsServiceMock() mockService.customError = APIError.networkError // 后续调用getPosts就会返回对应错误,验证错误处理逻辑是否符合预期
如果需要更灵活的控制,比如支持按调用次数返回不同结果(第一次成功、第二次失败),可以把customError改成数组类型,按getPostsCallCount取对应位置的错误即可,普通场景下上面的方案已经完全够用。
内容的提问来源于stack exchange,提问作者Wazza
相关产品推荐
相关产品推荐

