はじめに
OHHTTPStubsはHTTPレスポンスのモックを作るためのライブラリとしてはよく知られていますが、HTTPリクエストのテストを行う方法について調べても具体的な方法がでてこなかったので自分なりにまとめてみました。
リクエストのテストについて
公式のサンプルコードをみると、最初のところにstub(condition:)
があるのがわかります。
stub(condition: isHost("mywebservice.com")) { _ in
// Stub it with our "wsresponse.json" stub file (which is in same bundle as self)
let stubPath = OHPathForFile("wsresponse.json", type(of: self))
return fixture(filePath: stubPath!, headers: ["Content-Type":"application/json"])
}
ここの、condition
の中にHTTPリクエストのテストを記述することができます。
サンプルにあるisHost
は、HTTPリクエストのパスのホストがmyswbservice.com
であることをチェックしています。もしそうでない場合は通信がエラーになるのでXCTestが失敗します。
具体的に何がテストできるのか
ここからは、Githubをよく見ないとなかなか見つからない情報です。
(README.mdで軽く触れられている程度で、ドキュメントにも載ってないです)
OHHTTPStubsSwift.swiftを見ると、condition
引数に指定できる条件の関数が定義されているのでここからテストに必要なものを探して、&&
や||
でつなげてください。
以下、テストできる内容のまとめです。
(何がテストできるのかについてイメージしやすいようにしているので、全ては掲載していません。詳しくはソースを御覧ください。)
-
isMethodGET
: GETメソッドかどうか -
isAbsoluteURLString
: URLが絶対パスになっているかどうか -
isScheme
: スキームが正しいかどうか -
isPath
: パスが正しいかどうか -
containsQueryParams
: クエリパラメータを含むかどうか -
hasHeaderNamed
: ヘッダーを含むかどうか -
hasBody
: リクエストボディが存在するかどうか -
hasJsonBody
: JSON形式のリクエストボディの内容が期待通りの内容かどうか
いつ使うの?
そもそも情報がない理由として、APIが正しく動作しているかどうかは、わりと実際に通信してから試したりすることが多くあまり使われるケースが少ないからだと予想しています。
特にiOSアプリの開発ですと、レスポンスの形式に関心があることが多く、リクエストのテストに目が向けられないということも一因として挙げられそうです。
特に以下のようなケースではこの機能がとても有用だと思うので、ぜひ選択肢の一つとして覚えておくと良いと思います。
- 開発初期のモックサーバーが存在しない状態での開発
- アプリ内で共通で使うAPIクライアントを作成するとき
- 本当に正しいパスを選べているか?
- 本当にヘッダーが正しく指定できているか?