SwiftNIOMock 0.0.1

SwiftNIOMock 0.0.1

Ilya Puchka 维护。



 
依赖
SwiftNIO~> 1.11.0
SwiftNIOHTTP1~> 1.11.0
 

  • 作者:
  • Ilya Puchka

SwiftNIOMock

这是一个基于 SwiftNIO 的网络服务器,旨在用作 UI 自动化测试中的模拟服务器。

当对实际服务器进行 UI 测试时,可能会遇到几个问题:网络可能不稳定,远程服务器上的内容可能会改变,某些测试场景可能需要外部系统中的一些动作,而且在一般情况下,所有的网络调用都会减慢所有测试。

SwiftNIOMock 通过提供运行在本地的模拟网络服务器实现来解决这些问题,应用在 UI 测试运行时应访问此模拟服务器,而不是真实服务器。与其他解决方案不同,使用模拟服务器不需要使用类似自定义 URLProtocol 的方法,只需将应用切换到 localhost,并且它提供了更大的灵活性和控制能力,因为服务器由测试控制,您可以在测试场景中更改其状态。

SwiftNIOMock 支持三个常见的场景

  • 使用 redirect 中间件将请求重定向到真实服务。这可以用于日志记录目的,可以使调试更容易,因为所有网络日志都将出现在测试运行程序的控制台日志中

  • 使用 router 中间件对端点进行模拟。这在您需要更多控制模拟服务器的状态时很有用,并且允许您完全模拟应用发出的所有网络请求(尽管它可以与 redirect 中间件一起使用)。通常在测试场景需要外部系统中的动作时需要这样做。当您可以完全控制服务器状态时,可以轻松地伪造这样的操作

  • 使用提供 URLSession 实现的 redirect 中间件录制和回放网络调用。这可以用来确保测试在不同运行之间接收到相同的数据,并旨在保护以防远程服务器上的不可控更改

使用方式

在测试中,在 setUp 方法中创建一个服务实例并启动它,并提供一个中间件来处理请求。在 tearDown 方法中停止服务器。

override func setUp() {
    server = Server(port: 8080, handler: <#Middleware#>)
    try! server.start()
}

override func tearDown() {
    try! server.stop()
    server = nil
}

中间件是一个函数,基于传入的请求可以修改响应。

typealias Middleware = (
    _ request: Server.HTTPHandler.Request,
    _ response: Server.HTTPHandler.Response,
    _ next: @escaping () -> Void
) -> Void

当中间件函数完成对响应的处理后,应调用传递给它的 next 闭合(可以异步调用它),以将控制权返回给服务器。您可以编写自己的中间件或使用 SwiftNIOMock 提供的中间件,如 redirectrouterdelay。以下是一个简单中间件的示例,该中间件可以回显任何传入的请求

func echo(
    request: Server.HTTPHandler.Request,
    response: Server.HTTPHandler.Response,
    next: @escaping () -> Void
) {
    response.statusCode = .ok
    response.body = request.body
    next()
}

redirect 中间件允许您重定向传入请求并拦截响应。它还接受一个 URLSession 实例(默认为 URLSession.shared 会话)来执行请求,这允许它记录和回放所有请求。请查看 SwiftNIOMockExampleUITests.swift 以查看使用 SwiftNIOMock 进行记录和回放模式的示例,该模式由 Vinyl 支持构建。

func redirect(
    session: URLSession = URLSession.shared,
    request override: @escaping (Server.HTTPHandler.Request) -> Server.HTTPHandler.Request,
    response intercept: @escaping (Server.HTTPHandler.Response) -> Void = { _ in }
) -> Middleware

router 中间件允许您根据请求返回任意中间件,即其方法和路径。如果请求无法处理,将使用作为 notFound 参数传递的回退中间件。

func router(
    route: @escaping (Server.HTTPHandler.Request) -> Middleware?,
    notFound: @escaping Middleware
) -> Middleware

要查看在 UI 测试中使用 SwiftNIOMock 的示例,请查看 SwiftNIOMockExample。

安装

您可以使用 CocoaPods (1.6.0.beta.2)或 Swift 包管理器安装 SwiftNIOMock。