在 Swift 中使用 OHHTTPStubs 测试请求正文



我正在尝试测试使用 OHHTTPStubs 捕获的请求正文发送的请求正文,但它似乎有错误返回,因为 request.httpBody nil.

我发现了有关此问题的信息 在您的存根中测试请求正文。但是我在 iOS 开发方面很陌生,不知道如何在 Swift 中访问OHHTTPStubs_HTTPBody。我该怎么做?

我想 Swift 中的粗略等价物如下:

import OHHTTPStubs.NSURLRequest_HTTPBodyTesting
...
stub(isMethodPOST() && testBody()) { _ in
  return OHHTTPStubsResponse(data: validLoginResponseData, statusCode:200, headers:nil)
}).name = "login"
public func testBody() -> OHHTTPStubsTestBlock {
  return { req in 
    let body = req.ohhttpStubs_HTTPBody()
    let bodyString = String.init(data: body, encoding: String.Encoding.utf8)
    return bodyString == "user=foo&password=bar"
  }
}

因此,更准确地说,您可以通过调用OHHTTPStubsTestBlock中的ohhttpStubs_HTTPBody()方法来访问OHHTTPStubs_HTTPBody

对我有用的是:

func testYourStuff() {
    let semaphore = DispatchSemaphore(value: 0)
    stub(condition: isScheme(https)) { request in
        if request.url!.host == "blah.com" && request.url!.path == "/blah/stuff" {
            let data = Data(reading: request.httpBodyStream!)
            let dict = Support.dataToDict(with: data)
            // at this point of time you have your data to test
            // for example dictionary as I have
            XCTAssertTrue(...)
        } else {
            XCTFail()
        }
        // flag that we got inside of this block
        semaphore.signal()
        return OHHTTPStubsResponse(jsonObject: [:], statusCode:200, headers:nil)
    }
    // this code will be executed first,
    // but we still need to wait till our stub code will be completed
    CODE to make https request
    _ = semaphore.wait(timeout: DispatchTime.distantFuture)
}
// convert InputStream to Data
extension Data {
init(reading input: InputStream) {
    self.init()
    input.open()
    let bufferSize = 1024
    let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
    while input.hasBytesAvailable {
        let read = input.read(buffer, maxLength: bufferSize)
        self.append(buffer, count: read)
    }
    buffer.deallocate(capacity: bufferSize)
    input.close()
  }
}
感谢

此人将 InputStrem 转换为数据:将 InputStream 读取为 Data 对象

最新更新