Test¶
Vapor include un modulo chiamato XCTVapor
che fornisce supporto per i test utilizzando XCTest
. Questo supporto al testing ti permette di inviare richieste di test alla tua applicazione Vapor programmaticamente o attraverso un server HTTP.
Inizio¶
Per usare il modulo XCTVapor
, assicurati sia stato aggiunto ai target dei test del tuo pacchetto.
let package = Package(
...
dependencies: [
.package(url: "https://github.com/vapor/vapor.git", from: "4.0.0")
],
targets: [
...
.testTarget(name: "AppTests", dependencies: [
.target(name: "App"),
.product(name: "XCTVapor", package: "vapor"),
])
]
)
Dopodiché, aggiungi import XCTVapor
in cima ai file dei tuoi test. Per scrivere dei test, crea classi che estendono XCTestCase
.
import XCTVapor
final class MyTests: XCTestCase {
func testStub() throws {
// Esegui il test qui.
}
}
Ciascuna funzione che inizia con test
sarà eseguita automaticamente quando la tua app viene testata.
Eseguire i Test¶
Per eseguire i test su Xcode, usa cmd+u
con -Package
come schema. Usa swift test --enable-test-discovery
per testare attraverso l'interfaccia a riga di comando.
Application Testabile¶
Inizializza un'instanza di Application
usando l'ambiente .testing
. Devi chiamare app.shutdown()
prima che questa applicazione si deinizializzi.
Lo shutdown è necessario per aiutare a rilasciare le risorse che l'app ha reclamato, in particolare è importante rilasciare i thread richiesti all'avvio dell'applicazione. Se non chiami shutdown()
sull'app dopo ogni test, potresti vedere la tua suite di test crashare con un fallimento di precondizione quando alloca thread per una nuova istanza di Application
.
let app = Application(.testing)
defer { app.shutdown() }
try configure(app)
Passa la Application
al metodo configure(_:)
del tuo pacchetto per applicare la tua configurazione. Qualsiasi configurazione relativa ai soli test può essere applicata successivamente.
Invia Richiesta¶
Per inviare una richiesta di test alla tua applicazione, usa il metodo test
.
try app.test(.GET, "ciao") { res in
XCTAssertEqual(res.status, .ok)
XCTAssertEqual(res.body.string, "Ciao, mondo!")
}
I primi due parametri sono il metodo HTTP e l'URL da interrogare. La chiusura successiva accetta la risposta HTTP che puoi verificare usando i metodi XCTAssert
.
Per richieste più complesse, puoi fornire una chiusura beforeRequest
per modificare gli header o per codificare il contenuto. L'API Content di Vapor è disponibile sia sulla richiesta che sulla risposta di test.
try app.test(.POST, "promemoria", beforeRequest: { req in
try req.content.encode(["titolo": "Test"])
}, afterResponse: { res in
XCTAssertEqual(res.status, .created)
let todo = try res.content.decode(Todo.self)
XCTAssertEqual(todo.title, "Test")
})
Metodo Testable¶
L'API di testing di Vapor supporta l'invio di richieste di test programmaticamente e attraverso un server HTTP attivo. Puoi specificare quale metodo vorresti usare utilizzando il metodo testable
.
// Usa il testing programmatico.
app.testable(method: .inMemory).test(...)
// Esegui i test attraverso un server HTTP attivo.
app.testable(method: .running).test(...)
L'opzione inMemory
è usata di default.
L'opzione running
supporta il passaggio di una porta specifica da utilizzare. Di default è usata la 8080
.
.running(port: 8123)