🥸 Stubby

一个简单的 URLSession 响应桩库。

build codecov CodeFactor

开始使用

通过 Swift Package Manager 将 Stubby 添加到您的项目中

.package(url: "https://github.com/bdbergeron/Stubby", from: "1.0.0"),

在您的 Tests 文件夹中,创建一个符合 StubbyResponseProvider 协议的对象

import Foundation
import Stubby
import XCTest

extension URL {
  static let repoURL = URL(string: "https://bdbergeron.github.io")!
  static let githubURL = URL(string: "https://github.com")!
}

struct SomeResponseProvider: StubbyResponseProvider {
  static func respondsTo(request: URLRequest) -> Bool {
    true
  }

  static func response(for request: URLRequest) throws -> Result<StubbyResponse, Error> {
    switch try XCTUnwrap(request.url) {
    case .repoURL:
      return try .success(.init(data: try XCTUnwrap("Hello, world!".data(using: .utf8)), for: .repoURL))
    default:
      return .failure(URLError(.unsupportedURL))
    }
  }
}

现在您可以在测试中使用您的响应提供者了

import Stubby
import XCTest

final class StubbyTests: XCTestCase {
  func test_stubbedResponse_succeeds() async {
    let urlSession = URLSession.stubbed(responseProvider: SomeResponseProvider.self)
    let request = URLRequest(url: .repoURL)
    do {
      let (data, _) = try await urlSession.data(for: request)
      let string = String(data: data, encoding: .utf8)
      XCTAssertEqual(string, "Hello, world!")
    } catch {
      XCTFail("Unexpected error: \(error)")
    }
  }

  func test_stubbyResponse_failsWithUnsupportedURLError() async {
    let urlSession = URLSession.stubbed(responseProvider: SomeResponseProvider.self)
    let request = URLRequest(url: .githubURL)
    do {
      _ = try await urlSession.data(for: request)
      XCTFail("Should fail.")
    } catch let error as NSError {
      XCTAssertEqual(error.domain, URLError.errorDomain)
      let expectedError = URLError(.unsupportedURL)
      XCTAssertEqual(error.code, expectedError.errorCode)
      XCTAssertEqual(error.localizedDescription, expectedError.localizedDescription)
    } catch {
      XCTFail("Unexpected error: \(error)")
    }
  }
}