RubyとRailsとminitestのマルチバージョンでのCI環境の話

at 2015-11-16 05:27 (UTC)

pinzolo/rails-flog の Rails4.2でのテストが落ちてて、でも動いてるしーで放置してしまってた。 んで、ちゃんとしないとと思って調べてみたら、テストを壊していたのはテストコード(と自分の思い込み)だった。 具体的には mocha というモックライブラリを使用していたんだけど、スタブ作ったらテストケースをまたいで存在し続けるのを、テストケースセーフだと思い込んでいた。以前のバージョンではシーケンシャルにテストが行われていたけど、ランダムになったのでテストが落ちるようになった。

どうりでローカルでテストすると時々によってエラーの数が違うわけだ。 んで minitest にもモック・スタブ機能があることを知り、ブロックでの影響範囲を限定できるのでこっちのほうがいいじゃん!!と mocha を削除し minitest のスタブに統一した。

ここまで前置き

ローカルでテスト通ったーと喜んで push すると travis でコケる
Ruby1.9 & Rails3.2ではstubなんてないよと怒られ、Ruby2.2 & Rails3.2では minitest/autorunがないと怒られた。 Ruby1.9に同梱されている minitest には minitest/mock がまだ存在していなかったらしい。

調べてみると明示的に最新の minitest を使うのが良いらしく gemspec に足してみた。 すると今度は Rails3.2で軒並みコケた
警告も出てるし、いくつか試行錯誤してRails3.2では minitest のバージョンを 4.7.x となるように指定したら、今度はRuby2.2の時だけ test-unitが足りない と言われる。 そういや削除されたんだったっけ。

これでようやく全部通った。なまじ同梱されてるから環境の差分を調整するのはしんどい。