我們在開發(fā)過程中,很多時候可能都需要Mock一個后臺,原因可能是下面兩種:
- 后臺沒開發(fā)完,只有文檔,前端開發(fā)又需要數(shù)據(jù)來方便開發(fā)
- 測試需要,我們單元測試需要各種情況,很多情況是我們正常情況后臺無法提供的,而且顯然我們也不應該向真實后臺提交各種測試數(shù)據(jù)。
那么針對上面兩種不同的需求,我們提供不同的方案
為了方便開發(fā)
對于這種需求我個人覺得最好可以不要在項目中寫關于mock的代碼,這里推薦兩種方案,兩種方案都幾乎不需要在項目中寫關于mock的代碼,只需要修改項目中服務器地址就好了。
Postman
postman是一款非常常用的模擬請求的工具,相信大家對他都不陌生。postman方案的優(yōu)勢就是有UI頁面,可操作起來更直觀一些
首先我們點擊左上角的new按鈕
然后選擇Mock server

然后按照提示一步一步,設置路徑,設置response內容等等一些內容
[圖片上傳失敗...(image-35a1aa-1545309290011)]

如果設置后還需要修改返回內容,參考下圖,點擊右上角的按鈕就可以進行修改
[圖片上傳失敗...(image-78bc64-1545309290011)]

moco
moco是一個java的后端,下載安裝之后,我們就可以直接編寫一個JSON格式的文件,一行命令便可以完成這個使命
使用時就將你的app host地址改為localhost:設置的端口,然后就可以獲取之前你寫好的json數(shù)據(jù)
java -jar pathto/Moco-runner-<version>-standalone.jar http -p 12306 -c pathTo/foo.json
需要注意的是,如果開了全局翻墻,需要改成auto proxy mode,否則請求就會失敗
為了測試
這種為了單元測試的情況,雖然上面提到的方案其實也是可以完成測試的,但是還需要依賴項目外的環(huán)境設置,不是那么完美。那么我們就有必要把代碼寫在項目中,以實現(xiàn)不依賴項目外的環(huán)境完成測試
其實這里準確的說法應該是Stub
假定我們是使用Apple自帶的XCTest
由于網(wǎng)絡請求是異步的,所以單元測試需要使用XCTestExpectation waitForExpectations fullfile配合完成測試,這部分就不再贅敘了,我們就直奔主題
我們需要一個第三方庫的幫助,OHHTTPStubs
這個庫主要是把你的請求攔截下來,然后返回你指定的內容,可以是你寫好的json文件
我們先設置好stub,我們把URL最后一部分是“l(fā)istItems”的請求攔截下來,返回httpStub.json文件中的內容。這里其實可以設置其他的內容,比如把某個Host的請求全部攔截了,這都是可以設置的,大家可以看下OHHTTPStubs倉庫中的demo
- (void)installStubs {
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest * _Nonnull request) {
return [request.URL.lastPathComponent isEqualToString:@"listItems"];
} withStubResponse:^OHHTTPStubsResponse * _Nonnull(NSURLRequest * _Nonnull request) {
return [[OHHTTPStubsResponse responseWithFileAtPath:OHPathForFile(@"httpStub.json", self.class)
statusCode:200
headers:@{@"Content-Type":@"application/json; charset=utf-8"}]
requestTime:0.5f
responseTime:OHHTTPStubsDownloadSpeedWifi];
}];
}
這個方法需要在測試真正開始前配置好,所以我們在setUp方法中調用installStubs
- (void)setUp {
// Put setup code here. This method is called before the invocation of each test method in the class.
[self installStubs];
}
我們command+U測試一下,返回了我們json文件中的內容。到這里我們就完成了測試中模擬數(shù)據(jù)的部分
總結
我們文章中介紹了三種方式,其實我個人是最喜歡最后一種,為什么呢?
首先,他完全可以在取代前面兩種方式,而且不依賴網(wǎng)絡不依賴第三方軟件,雖然侵入了項目,但是好在不是很多,可以通過IF DEBUG的方式確保就算我們忘記移除,也不會影響release的版本。
再其次,為了做了這個就基本完成了這個接口網(wǎng)絡請求的單元測試用例,簡直一舉兩得,雖然iOS開發(fā)這個領域,測試并沒有那么普及,大家也普遍沒有做這項工作,但是測試確實是保證項目質量的重要方式,養(yǎng)成寫測試用例的習慣可以幫我們提前發(fā)現(xiàn)很多的bug。
參考資料
Postman Setting up a mock serve
Real-World Testing with XCTest
The complete guide to Network Unit Testing in Swift
Asynchronous Tests and Expectations