どんなにがんばっても ruby 1.8.7 では動かすことができない cucumber のシナリオがあって、これを対応した時のメモ。

結論から書いておきます。

  • @fails_on_1_8_7 というタグを使って、失敗するシナリオをタグづけ
  • cucumber の profile に ruby_1_8_7 をつくり --tags ~@failds_on_1_8_7 を設定
  • rake 実行時に RUBY_VERSION をみて profile を ruby_1_8_7 になるように設定

です。

テストは Travis CI で実行します。Travis では rake が実行されるので、rake 実行時にprofile を切り替えるようにしました。 もともとそのプロジェクトには ruby_1_9 というのと ruby_2_0 というのがあったのでそれらに合わせました。

具体的には cucumber/cucumber に出したpull request です。

ちょっと掘り下げておく。

cucumber には profile という機能があって、あらかじめ設定しておいたオプションを切り替える機能があります。 cucumber --profile ruby_1_8_7 みたいに使います。

これを rake task に割り当てるには Cucumber::Rake::Task のインスタンスのprofile に渡してやればいいです。 new したときのブロックの第1引数が Cucumber::Rake::Task そのものです。

例:

Cucumber::Rake::Task.new do |t|
  t.profile = 'ruby_1_8_7'
end

cucumber のプロジェクトではは、この設定は gem_tasks/cucumber.rakeにあります。

ちなみに Cucumber::Rake::Tasklib/cucumber/rake/task.rb に定義されています。

あとは travis が勝手に実行にしてくれる寸法です。

Cucumber のテストを Cucumber で書いてて紛らわしい例ですいません。

ちなみに、このpull request が取り込まれると以下のブログ記事にある修正が不必要になります。steps で日本語が使えます。

関連記事