開發(fā)小技巧-mock

我們在開發(fā)過程中,很多時候可能都需要Mock一個后臺,原因可能是下面兩種:

  • 后臺沒開發(fā)完,只有文檔,前端開發(fā)又需要數(shù)據(jù)來方便開發(fā)
  • 測試需要,我們單元測試需要各種情況,很多情況是我們正常情況后臺無法提供的,而且顯然我們也不應該向真實后臺提交各種測試數(shù)據(jù)。

那么針對上面兩種不同的需求,我們提供不同的方案

為了方便開發(fā)

對于這種需求我個人覺得最好可以不要在項目中寫關于mock的代碼,這里推薦兩種方案,兩種方案都幾乎不需要在項目中寫關于mock的代碼,只需要修改項目中服務器地址就好了。

Postman

postman是一款非常常用的模擬請求的工具,相信大家對他都不陌生。postman方案的優(yōu)勢就是有UI頁面,可操作起來更直觀一些

首先我們點擊左上角的new按鈕

然后選擇Mock server

Screen Shot 2018-12-16 at 6.44.32 PM

然后按照提示一步一步,設置路徑,設置response內容等等一些內容

[圖片上傳失敗...(image-35a1aa-1545309290011)]

Screen Shot 2018-12-16 at 6.46.53 PM

如果設置后還需要修改返回內容,參考下圖,點擊右上角的按鈕就可以進行修改

[圖片上傳失敗...(image-78bc64-1545309290011)]

Screen Shot 2018-12-16 at 6.52.38 PM

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。

參考資料

moco

Postman Setting up a mock serve

Real-World Testing with XCTest

The complete guide to Network Unit Testing in Swift

Asynchronous Tests and Expectations

isKindOfClass doesn't work as expected

測試中 Fakes、Mocks 以及 Stubs 概念明晰

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容