我来自将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)
}
在所有这些示例中,返回值实际上都设置为传递回可解码的内容(decodeTo:
类型的设置)。在某些情况下,在我的Vapor 3代码中,我只想验证一些非JSON编码的结果-只是简单的字符串,然后验证结果-但我还没有找到进入内容的方法或使用验证方法的简便方法XCTAssert。
response.content
可用,它是整个响应(类型为ContentContainer)的容器。是否有一些示例或好的方法可以直接访问基础内容表示形式?
答案 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")
}