搜狐首页 科技 宫主大人

手机搜狐

SOHU.COM

请求行为

译者:Cwift;校对:walkingway;定稿:CMB

当触发网络请求时,通常会引发许多副作用。然而,副作用对于系统的可测试性来说就是一剂毒药,并且可能会因应用程序和请求的不同而出现差异性。如果我们创建一个系统用来容纳这些副作用的组合,就可以提高系统的可测试性和其他特性。

想象一个非常简单的网络客户端:

final class NetworkClient { let session: URLSession init(session: URLSession = URLSession.shared) { self.session = session } func sendOutput: JSONInitializable(request: RequestOutput) - PromiseOutput { let urlRequest = RequestBuilder(request: request).urlRequest return session.data(with: urlRequest) .then({ data, response in let json = try JSONSerialization.jsonObject(with: data) return Output(json: json) }) }}

这个类封装了一个 URLSession。它有一个 send 方法,该方法接受一个 Request 对象,Request 中有一个遵守 JSONInitializable 协议的抽象关联类型 Output。send 方法返回一个具有相同关联类型 Output 的 promise。在 send 方法的正文中,通过 RequestBuilder 类型构建 URLRequest,通过 URL 会话发送请求。从网络请求返回的数据将被解析为 JSON,然后组装成 Swift 原生的模型,该模型作为返回的 promise 内部的值。

这个网络客户端被大大简化了(即我省略了一些与可选型相关的处理),但是我想要的代码基本齐全。

这个类现在很不错。它是个简单对象,不接触任何全局对象(省去了网络配置,通过一个 URLSession 来通信),并且很容易测试。我们可以把 URLSession 封装在协议中,然后注入到 NetworkClient 的构造器中,在测试中模拟它的行为,测试从 JSON 响应中构造对象的逻辑。一段可测试的网络请求代码!

精选