如果進(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