如何在Vapor 3单元测试中从响应中访问原始内容?

时间:2019-02-08 21:32:10

标签: swift vapor

我来自将SuperTest之类的工具与NodeJS结合使用,并寻找相关的对等物来支持Vapor 3和服务器端swift的测试。

我看到一种使用Vapor 3编写可测试应用程序来进行端点测试的模式,示例为https://github.com/raywenderlich/vapor-til/blob/master/Tests/AppTests/Application%2BTestable.swift和在https://medium.com/swift2go/vapor-3-series-iii-testing-b192be079c9e处的记录。

在测试中使用它们时,格式通常类似于:

func testGettingASingleUserFromTheAPI() throws {
    let user = try User.create(name: usersName, username: usersUsername, on: conn)
    let receivedUser = try app.getResponse(to: "\(usersURI)\(user.id!)", decodeTo: User.Public.self)

    XCTAssertEqual(receivedUser.name, usersName)
    XCTAssertEqual(receivedUser.username, usersUsername)
    XCTAssertEqual(receivedUser.id, user.id)
  }

(来自Vapor-TIL example code

在所有这些示例中,返回值实际上都设置为传递回可解码的内容(decodeTo:类型的设置)。在某些情况下,在我的Vapor 3代码中,我只想验证一些非JSON编码的结果-只是简单的字符串,然后验证结果-但我还没有找到进入内容的方法或使用验证方法的简便方法XCTAssert。

response.content可用,它是整个响应(类型为ContentContainer)的容器。是否有一些示例或好的方法可以直接访问基础内容表示形式?

1 个答案:

答案 0 :(得分:2)

您可以在Application+Testable中编写自己的其他方法,例如

func getRawResponse(to path: String) throws -> Response {
    return try self.sendRequest(to: path, method: .GET)
}
func getStringResponse(to path: String) throws -> String {
    let response = try self.getRawResponse(to: path)
    guard let data = response.http.body.data,
          let string = String(data: data, encoding: .utf8) else {
        throw SomeError("Unable to decode response data into String")
    }
    return string
}

然后调用它们以获取原始Response或已解码的String,如

func testGettingHelloWorldStringFromTheAPI() throws {
    let string = try app. getStringResponse(to: "some/endpoint")

    XCTAssertEqual(string, "Hello world")
}