開源的http單元測試庫Nocilla介紹

如果進(jìn)行移動(dòng)互聯(lián)網(wǎng)的開發(fā),客戶端和服務(wù)器端在開發(fā)過程中的解耦很重要,如果任何調(diào)試屿讽,都要等待服務(wù)端完成之后才能進(jìn)行,那將大大的拖累研發(fā)進(jìn)度,所以通過模擬HTTP服務(wù)器伐谈,再加上單元測試技術(shù)烂完,輔助客戶端的開發(fā)就成為一項(xiàng)必要的工作。

1. Nocilla庫是干什么的诵棵?

本文內(nèi)容來主要來自于Nocilla的readme文件, Nocilla是一個(gè)開源的http stub庫: github項(xiàng)目地址抠蚣。
他的用途是在iOS和OSX系統(tǒng)上對HTTP進(jìn)行stub,簡化發(fā)出HTTP請求的單元測試履澳。
Nocilla借鑒了WebMock庫嘶窄,使用了這篇文章中所采用的方法。

2. 功能特性

  • 在單元測試中stub HTTP和HTTPS請求
  • 支持NSURLConnection, NSURLSession 和 ASIHTTPRequest.
  • 超棒的DSL將提升測試的可讀性和可維護(hù)性
  • 利用正則表達(dá)式匹配請求
  • stub請求報(bào)錯(cuò)情況
  • 可測試的
  • 速度快
  • 通過擴(kuò)展支持更多的HTTP庫的

3. 安裝方法

  • 使用CocoaPod安裝
    只需在Podefile中加入:
    pod 'Nocilla'
  • 其他安裝方法
    你可以直接把Nocilla加入你的源碼中距贷。如果你使用git柄冲,考慮把它作為一個(gè)git子模塊

4.使用方法

用法主要是
下面的代碼是Objective-c的, 使用Kiwi描述。

4.1 通用部分:

在使用Nocilla的文件里:
<code>#import "LSNocilla.h"</code>
開始:
<code>[[LSNocilla sharedInstance] start];</code>
清理stub:
<code> [[LSNocilla sharedInstance] clearStubs];</code>
結(jié)束:
<code> [[LSNocilla sharedInstance] stop];</code>

4.2 Stubbing請求

  • Stubing一個(gè)簡單請求
    它會(huì)返回一個(gè)默認(rèn)的響應(yīng)储耐,返回200狀態(tài)和空body羊初。
    <code>
    stubRequest(@"GET", @"http://www.google.com");
    </code>
  • stubbing 使用正則表達(dá)式描述的請求
    <code>stubRequest(@"GET", @"^http://(.*?)\.example\.com/v1/dogs\.json".regex);</code>
  • Stubbing一個(gè)請求,返回特定的header
    <code>stubRequest(@"GET", @"https://api.example.com").
    withHeader(@"Accept", @"application/json");</code>
  • Stubing一個(gè)請求什湘,請求帶多重headers
    使用 withHeaders方法,參數(shù)是一個(gè)字典
    <code>stubRequest(@"GET", @"https://api.example.com/dogs.json").
    withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"});
    </code>
  • Stubbing一個(gè)請求晦攒,請求帶特定的body
    <code>stubRequest(@"POST", @"https://api.example.com/dogs.json").
    withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
    withBody(@"{"name":"foo"}");
    </code>
    可以使用NSData作為請求數(shù)據(jù):
    <code>stubRequest(@"POST", @"https://api.example.com/dogs.json").
    withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
    withBody([@"foo" dataUsingEncoding:NSUTF8StringEncoding]);
    </code>
    It even works with regular expressions!
    甚至使用正則表達(dá)式做請求的body
    <code>stubRequest(@"POST", @"https://api.example.com/dogs.json").
    withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
    withBody(@"^The body start with this".regex);
    </code>

4.3 模擬響應(yīng)

  • 返回響應(yīng)闽撤,指定的status code
    <code>stubRequest(@"GET", @"http://www.google.com").andReturn(404);</code>
  • 返回指定的響應(yīng)status code和響應(yīng)header
    你可以使用withHeader或者withHeaders:
    <code>stubRequest(@"POST", @"https://api.example.com/dogs.json").
    andReturn(201).
    withHeaders(@{@"Content-Type": @"application/json"});</code>
  • 返回響應(yīng),指定的status code, headers和body
    <code>stubRequest(@"GET", @"https://api.example.com/dogs.json").
    andReturn(201).
    withHeaders(@{@"Content-Type": @"application/json"}).
    withBody(@"{"ok":true}");</code>
  • 響應(yīng)可以使用NSData作為響應(yīng)的body
    <code>
    stubRequest(@"GET", @"https://api.example.com/dogs.json").
    andReturn(201).
    withHeaders(@{@"Content-Type": @"application/json"}).
    withBody([@"bar" dataUsingEncoding:NSUTF8StringEncoding]);</code>
  • 使用curl -is返回raw responses(文件類的)
    curl -is http://api.example.com/dogs.json > /tmp/example_curl_-is_output.txt
    <code>stubRequest(@"GET", @"https://api.example.com/dogs.json").
    andReturnRawResponse([NSData dataWithContentsOfFile:@"/tmp/example_curl_-is_output.txt"]);</code>
  • 用法全家福
    <code>stubRequest(@"POST", @"https://api.example.com/dogs.json").
    withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
    withBody(@"{"name":"foo"}").
    andReturn(201).
    withHeaders(@{@"Content-Type": @"application/json"}).
    withBody(@"{"ok":true}");</code>

4.3使請求失敗

這會(huì)調(diào)用failure handler(callback, delegate...不管已使用什么HTTP client)脯颜,返回特定的error
<code>
stubRequest(@"POST", @"https://api.example.com/dogs.json").
withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
withBody(@"{"name":"foo"}").
andFailWithError([NSError errorWithDomain:@"foo" code:123 userInfo:nil]);</code>

4.4 意料之外的請求

如果有些請求沒有被stubbed哟旗,卻發(fā)出了,Nocilla不會(huì)讓它傳到真實(shí)的網(wǎng)絡(luò)上栋操。請求會(huì)失敗闸餐,并且產(chǎn)生一個(gè)異常,異常提供了錯(cuò)誤的信息以及解決的方法矾芙,甚至提供了如何stub這個(gè)請求的代碼片段舍沙。

5. Nocilla誰在用.

Groupon
Pixable
Jackthreads
ShopKeep
Other alternatives
ILTesting
OHHTTPStubs
Contributing
Fork it
Create your feature branch
Commit your changes
Push to the branch
Create new Pull Request

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剔宪,隨后出現(xiàn)的幾起案子拂铡,更是在濱河造成了極大的恐慌,老刑警劉巖葱绒,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件感帅,死亡現(xiàn)場離奇詭異,居然都是意外死亡地淀,警方通過查閱死者的電腦和手機(jī)失球,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帮毁,“玉大人实苞,你說我怎么就攤上這事璧微。” “怎么了硬梁?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵前硫,是天一觀的道長。 經(jīng)常有香客問我荧止,道長屹电,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任跃巡,我火速辦了婚禮危号,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘素邪。我一直安慰自己外莲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布兔朦。 她就那樣靜靜地躺著偷线,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沽甥。 梳的紋絲不亂的頭發(fā)上声邦,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機(jī)與錄音摆舟,去河邊找鬼亥曹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛恨诱,可吹牛的內(nèi)容都是我干的媳瞪。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼照宝,長吁一口氣:“原來是場噩夢啊……” “哼蛇受!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起硫豆,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤龙巨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后熊响,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旨别,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年汗茄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秸弛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖递览,靈堂內(nèi)的尸體忽然破棺而出叼屠,到底是詐尸還是另有隱情,我是刑警寧澤绞铃,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布镜雨,位于F島的核電站,受9級特大地震影響儿捧,放射性物質(zhì)發(fā)生泄漏荚坞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一菲盾、第九天 我趴在偏房一處隱蔽的房頂上張望颓影。 院中可真熱鬧,春花似錦懒鉴、人聲如沸诡挂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽璃俗。三九已至,卻和暖如春吴裤,著一層夾襖步出監(jiān)牢的瞬間旧找,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工麦牺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鞭缭。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓剖膳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岭辣。 傳聞我的和親對象是個(gè)殘疾皇子吱晒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)沦童,斷路器仑濒,智...
    卡卡羅2017閱讀 134,716評論 18 139
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,440評論 2 45
  • 01 已經(jīng)不記得第一次聽到紅月的名字是什么時(shí)候偷遗,只是依稀記得在我學(xué)瑪雅歷的時(shí)候有聽說墩瞳。去年錯(cuò)過了紅月的生命全息圖,...
    宇宙玩家Lucy閱讀 475評論 0 1
  • 小妞兒最喜歡玩的游戲之一就是角色扮演氏豌『碜茫“媽媽,你能幫白鴿偵探說話嗎?”“媽媽泪电,你來扮葫蘆娃里面的爺爺吧”般妙,然后妞兒...
    春毅閱讀 189評論 0 0
  • 一 道可道,非常道相速;名可名碟渺,非常名。 無突诬,名天地之始苫拍;有,名萬物之母攒霹。故常無怯疤,欲以觀其妙;常有催束,欲以觀其徼集峦。此兩者...
    十一畫人生閱讀 953評論 4 1