我将使用诸如supertest和nodejs之类的工具,并寻找相关的等价物来支持vapor 3和服务器端swift的测试。
我看到了一种使用vapor 3开发可测试应用程序来测试端点的模式,例如https://github.com/raywenderlich/vapor-til/blob/master/Tests/AppTests/Application%2BTestable.swifthttps://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)。有没有一些例子或者很好的方法可以直接使用底层的内容表示来验证它们?

最佳答案

您可以在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
}

然后给他们打电话,要么是原始的,要么是解码的。
func testGettingHelloWorldStringFromTheAPI() throws {
    let string = try app. getStringResponse(to: "some/endpoint")

    XCTAssertEqual(string, "Hello world")
}

关于swift - 如何从Vapor 3单元测试中的响应访问原始内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54600531/

10-14 23:20