LoginSignup
7
7

More than 5 years have passed since last update.

XCTest+OCMock+OHHTTPStubsでHTTP通信のスタブ化

Posted at

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];
}
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7