WebAPIのユニットテストにスタブを使いたくて調べてみた。
概要
HTTP通信をスタブ化するライブラリは次の2つが見つかった。
Nocillaが簡潔に書けて良いと思ったが、ドキュメントにあるstubRequest(@"GET", @"http://www.google.com").andReturn(404);
のandReturn
の部分でコンパイルが通らない。どうやら、OCMockが定義しているandReturn
のマクロとネームスペースが重複しているらしく、同じソース内で利用することはできないようだった。
参考: objective c - Are OCMock and Nocilla incompatible? - Stack Overflow
OHHTTPStubsはNocillaに比べて記述量は多いが、OCMockと共存して使用できたためこちらを使うことにした。
環境
- Xcode 7
- OCMock 3.1.2
- OHHTTPStubs 4.3.0
- Nocilla 0.10.0
実装
@try {
// スタブを登録
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
// 戻り値をtrueにするとリクエストがスタブ対象になる
// ここではパスが`/v1/first/second`に一致するリクエストをスタブ化している
return [request.URL.path isEqualToString:@"/v1/first/second"];
} withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {
// スタブのレスポンスを定義する
// ここではHTTPステータス500のレスポンスを定義している
NSData *data = [@"{}" dataUsingEncoding:NSUTF8StringEncoding];
return [OHHTTPStubsResponse responseWithData:data statusCode:500 headers:@{@"Content-Type":@"application/json"}];
}];
// HTTP通信を伴う処理のテスト
// ...
}
@finally {
// 非同期処理が終了するのを待つ
// 例: BFTask
// [task waitUntilFinished];
// スタブを削除
// (setUp/tearDownでやるほうがいいかもしれない)
[OHHTTPStubs removeAllStubs];
}