🕸 TestURLProtocol

CI GitHub SPM

TestURLProtocol 是一个用于测试目的的 URLProtocol 子类。它允许为特定的 URL 设置模拟响应,这些响应将被返回,而不是进行真实的网络请求。这对于在不依赖外部资源或 API 的情况下测试应用程序的网络代码非常有用。

用法

要使用 TestURLProtocol,您首先需要将其注册到 URLProtocol

URLProtocol.registerClass(TestURLProtocol.self)

一旦您注册了 TestURLProtocol,您可以通过将模拟响应添加到 mockResponses 字典中,为特定的 URL 设置模拟响应。以下是如何操作的示例:

TestURLProtocol.mockResponses[url] = { request in
    (Result.success(data), statusCode)
}

mockResponses 字典接受一个闭包,该闭包接收一个 URLRequest,并返回一个元组,其中包含 Result 类型的结果 (包含 DataError) 以及一个可选的 statusCode

网络测试用例设置示例

通常,一个单元测试类可能测试与网络相关的代码。在这种情况下,设置可能如下所示。

final class NetworkingTest: XCTestCase {
    override class func setUp() {
        super.setUp()
        URLProtocol.registerClass(TestURLProtocol.self)
    }
    
    override class func tearDown() {
        super.tearDown()
        URLProtocol.unregisterClass(TestURLProtocol.self)
    }
    
    override func tearDown() {
        super.tearDown()
        TestURLProtocol.mockResponses.removeAll()
    }
}

不同的会话

如果您正在使用自定义的 URLSessionConfiguration,您可以像这样注册协议:

let config = URLSessionConfiguration.default
config.protocolClasses = [TestURLProtocol.self]
let session = URLSession(configuration: config)

注意

重要的是要注意,TestURLProtocol 仅适用于在 mockResponses 字典中注册过的 URL。如果请求的目标 URL 未被注册,TestURLProtocol 将不会处理该请求,它将被传递给下一个注册的 URLProtocol

此外,如果您注册了 TestURLProtocol,您必须确保它是 protocolClasses 数组中第一个注册的类,否则 URLSession 将使用列表中下一个协议来处理请求。