Как получить доступ к необработанному контенту из ответа в модульном тесте Vapor 3? - PullRequest
0 голосов
/ 09 февраля 2019

Я исхожу из использования таких инструментов, как 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 )

Во всех этих примерах возвращаемые значения действительно настроены на возврат к чему-либо декодируемому (настройка decodeTo:).В некоторых случаях в моем коде Vapor 3 я хочу просто проверить некоторые результаты, не закодированные в формате JSON, - просто простые строки и проверить результаты - но я не нашел методов для доступа к контенту или удобных способов проверки его с помощьюДоступен XCTAssert.

response.content, контейнер вокруг общего ответа (типа ContentContainer ).Есть ли какие-то примеры или хорошие способы добраться до базового представления контента, чтобы проверить их напрямую?

1 Ответ

0 голосов
/ 09 февраля 2019

Вы можете написать свои собственные дополнительные методы в 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")
}
...