Vaporドキュメント学習卅八:TESTING-Basic

2714 ワード

テストの一環はソフトウェアアプリケーション開発の重要な部分であり、Vaporアプリケーションも例外ではありません.このドキュメントでは、Dropletについてテストできる基本的な設定について説明します.

Displacing Droplet Creation Logic


以前はDropletを作成するコードをmain.swiftに入れていました.残念なことに、テストの際、コード量が大きいため可読性が悪くなります.まず、これらのコードをAppLogicモジュールに分解する必要があります.次はDroplet+Setup.swiftファイルです.
import Vapor

func load(_ drop: Droplet) throws {
    drop.preparations.append(Todo.self)

    drop.get { _ in return "put my droplet's logic in this `load` function" }

    drop.post("form") { req in
      ...
      return Response(body: "Successfully posted form.")
    }

    // etc.
}

警告:load関数でrun()メソッドを呼び出さないでください.

Update main.swift


上でloadの論理を抽出し、Appモジュールのmain.swiftファイルを更新する必要があります.
let drop = Droplet(...)
try load(drop)
drop.run()

load以外で初期化を行うのは,テスト時に異なる初期化方法を選択できるためである.

Testable Droplet


まず、Droplet+Test.swiftファイルをテストtargetに追加します.内容は次のとおりです.
@testable import Vapor

func makeTestDroplet() throws -> Droplet {
    let drop = Droplet(arguments: ["dummy/path/", "prepare"], ...)
    try load(drop)
    try drop.runCommands()
    return drop
}
main.swiftの初期化方法と同じように見えますが、3つの違いがあります.
Droplet(arguments: ["dummy/path/", "prepare"], ... Dropletの作成では、argumentsは異なります.高度なシナリオでは使用者が少ないことを除いて、Dropletがサービスを自動的に起動したり、スレッドをブロックしたりしないことを保証するために、テストで使用しました."prepare"以外のパラメータを使用できますが、いくつかの高度なシーンで特別な機能を実行しない限り、これらのパラメータは十分です.
try drop.runCommands()
気づいたかもしれませんが、runCommands()の代わりにrun()を使用しました.これにより、Dropletは、実際にsocketにバインドされたり終了したりすることなく、起動前に通常の設定をすべて実行することができる.(これは私もどのように訳すべきか分かりませんが、理解してから変更します)
@testable import Vapor
試験を導入したVaporは、runCommands()メソッドが呼び出されることを保証する.現在、この方法は公開されておらず、実際の使用時に意外なバグが発生することを避ける.

Test Our Droplet


作成が完了しました.Dropletのテストを開始できます.以下に、基本的なテストを示します.
@testable import AppLogic

func testEndpoint() throws {
    let drop = try makeTestDroplet()
    let request = ...
    let expectedBody = ...

    let response = try drop.respond(to: request)
    XCTAssertEqual(expectedBody, response.body.bytes)
}
CMD-Uを使用して、Xcodeの結果を持つテストをin-lineで実行できるようになりました.さらに、vapor testコマンドを実行してコードをテストできます.swift buildコマンドを使用し、アプリケーションでMySQLを使用する場合は、呼び出し可能な正しい構築IDであるflagを追加していることを確認します.
幸運を祈って、楽しいテストをしましょう.()