【備忘録】OHHTTPStubsで非同期テストメモ


久々にOHHTTPStubs使おうとしたら色々と忘れていたのでメモ
※ Quick/Nimble使用

beforeEach

beforeEach {
    // hoge.comに対するリクエストであれば、
    // 指定したjsonファイルから生成したstubをレスポンスとして使う
    stub(condition: isHost("hoge.com")) { _ in
        let stubPath = OHPathForFile("items.json", type(of: self))
        return fixture(filePath: stubPath!, headers: ["Content-Type": "application/json"])
    }
}

OHPathForFileはBundle.main.path同様内部的にプロジェクト内のファイルを探索してくれているんだろうか
特に相対パスで指定する必要とかはなかった(一敗)

またHost以外にもHttpMethodだったりPathだったり指定することもできるようだがそのへんはまたおいおい調べる

afterEach

afterEach {
    OHHTTPStubs.removeAllStubs()
}

個々のテストケース完了後も何もしなければstubは残り続けてしまうため、都度掃除してstub同士が干渉しないようにする必要がある

テスト箇所

fetchÎtems()はObservable

context("when request to stub") {
    it("fetch successful.") {
        waitUntil(timeout: 5) { done in 
            let model = Model()
            model.fetchItems().subscribe( onNext: { items in
                expect(items[0].id).to(equal("hoge"))
                done()
            }).disposed(by: self.disposeBag)
        }
    }
}

waitUntil()で明示的に待ってあげないとfetchItems()からeventが流れてくる前にafterEachが発火してしまうため注意が必要(一敗)

まとめ

OHHTTPStubs、API周りのstubを用いたテストが簡潔に記述できて大変良いと思ったので今後も積極的に活用していきたいですね