測(cè)試環(huán)節(jié)是任何軟件應(yīng)用程序開發(fā)的關(guān)鍵部分明垢,而Vapor應(yīng)用程序也不例外。 在本文檔中,我們將介紹一些能夠針對(duì)Droplet
進(jìn)行測(cè)試的基本設(shè)置败富。
Displacing Droplet Creation Logic
之前我們都是將創(chuàng)建Droplet
的代碼放在main.swift
里。不幸的是拢锹,在測(cè)試的時(shí)候谣妻,因?yàn)榇a量很大而使其可讀性變得很差。首先我們需要將這些代碼分解成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
函數(shù)中不要調(diào)用run()
方法蹋半。
Update main.swift
上面已經(jīng)將load的邏輯抽出去了,然后我們需要更新App
模塊的main.swift
文件充坑。
let drop = Droplet(...)
try load(drop)
drop.run()
之所以在load之外進(jìn)行初始化减江,是為了我們?cè)跍y(cè)試時(shí)可以選擇不同的初始化方法。
Testable Droplet
首先在測(cè)試target中添加一個(gè)Droplet+Test.swift
文件捻爷。內(nèi)容如下:
@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點(diǎn)不同。
Droplet(arguments: ["dummy/path/", "prepare"], ...
在Droplet
的創(chuàng)建中也榄,arguments
不同巡莹。除了在高級(jí)情景中者很少使用,我們?cè)跍y(cè)試時(shí)這么使用是為了保證Droplet
不會(huì)自動(dòng)啟動(dòng)服務(wù)或者阻塞線程甜紫。你可以使用"prepare"
之外的參數(shù)降宅,但是除非你是在某些高級(jí)場(chǎng)景下執(zhí)行特殊功能,否則這些參數(shù)足夠了囚霸。
try drop.runCommands()
你可能注意到了腰根,我們使用runCommands()
代替了run()
。這允許Droplet
在啟動(dòng)之前執(zhí)行正常情況下能夠做的所有設(shè)置拓型,而不會(huì)實(shí)際綁定到socket或退出额嘿。(<b>這我也不知道該怎么翻譯了,待理解后更改</b>)
@testable import Vapor
導(dǎo)入測(cè)試的Vapor
確倍质觯可以調(diào)用runCommands()
方法岩睁。目前這個(gè)方法未公開,避免在實(shí)際使用時(shí)出現(xiàn)意外的bug揣云。
Test Our Droplet
現(xiàn)在都已經(jīng)創(chuàng)建完畢了捕儒,可以開始測(cè)試我們的Droplet
了。下面是一些基本的測(cè)試:
@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)
}
請(qǐng)注意,現(xiàn)在你可以使用CMD-U
在Xcode
中運(yùn)行帶有in-line
結(jié)果的測(cè)試刘莹。 此外阎毅,您可以運(yùn)行vapor test
命令測(cè)試你的代碼。 如果你選擇使用swift build
命令点弯,并且你在應(yīng)用程序中使用了MySQL
扇调,請(qǐng)確保你添加了可調(diào)用的正確的構(gòu)建標(biāo)識(shí)--flag。
祝你好運(yùn)抢肛,愉快的測(cè)試吧@桥ァ(??)