Vai al contenuto

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)