としたにあんの左脳

備忘録です.

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のモックを作ってあげてテストをしたら良い.