motoはソケットを使うライブラリと併用できない問題
motoを使ってテストをしてた時,テスト中にテストが進まなくなる現象が起きた.
テストを見てみると,pymongoを使ってmongodbを叩いているプログラムのテストだった.(もちろんそのメソッドでbotoを使っていた)
そのテストはmockを使わずに,実際のmongodbインスタンスを使ってテストしていた.
悩んでいると,横の席の彼がこんなリンクを送ってくれた.
Interference with other network code · Issue #9 · spulec/moto · GitHub
要約するとmotoは全てのソケットをインターセプトしてしまうらしい.
なので,motoを使ったテストでは.httpリクエストやDBアクセスなどはモックを使って行わなければならないようだ.
requestを使ったサンプル
requestsを使ってHTTPアクセスするプログラムで実験してみた.
サンプルプログラム
requestsでgoogleにアクセスして,そのステータスコードをS3に保存するプログラム.
問題のあるテストコード
$ python test_with_moto_and_requests.py
このテストを実行するとかえって来なくなる.
動くテスト
ちゃんとrequestsのモックを作ってあげてテストをしたら良い.