blog.waterlow.work

Ruby, Rails, js, etc...

【Ruby】【RSpec】The RSpec BookをRspec3系とTurnipで読み替え

yosemiteにアップグレードしたせいなのかわかりませんが、Ruby1.9.2以前のRubyがインストールできなくなってしまいました。RSpec Bookは1.9.2か1.8.7ベースで書かれているのですが、Rubyは2.1.3、RSpecは3.1.7、またCucumberではなくTurnipを用いてこの本を読んでみます。(挫折せず最後まで読めることを願って…。)
まだChap4あたりなのですが、気になった違いをまとめます。

RSpecバージョン差による違い

本の中でのRSpecは2.0.0を使っているので、全てshouldで書かれていますが、現在はexpectを使います。そのため、はじめのHello RSpecの例だと以下の様な読替えが必要です。

greeting.should == 'Hello RSpec!'

expect(greeting).to eq 'Hello RSpec!'

ただそこまで複雑ではないですし、以下のようなまとめもあるので乗り越えられそう。
Ruby - RSpecのshouldはもう古い!新しい記法expectを使おう! - Qiita

Cucumber→Turnipの読み替え

そもそもCucumberを使わない理由はるびまに書いてあったのと、ちょっと前まで現場でも使っていたのがかなり重たかったためです。ここが面倒かと思ったのですが、featureファイルはほとんど同じ記述で動作します。さすがCucumberの後継!
step定義に関しても似たような書き方で行けます。詳しくは以下を参照。
jnicklas/turnip · GitHub
Ruby - Turnip README 超意訳 - Qiita
Rubyist Magazine - エンドツーエンドテストの自動化は Cucumber から Turnip へ

Then /^I should see "([^"]*)"$/ do |arg1|
  pending
end

step "I should see :arg1" do |arg1|
  pending
end

greatですね!!

ちょっと悩んでるとこ。

ただひとつ読み進める上で注意というか疑問点というか。
chapter4の4.3でstep定義ファイルに直接classを以下のように追加している箇所がある。

class Output
  def mssages
    # ...
  end
  # ...
end

Cucumberの場合はstep定義以外の記載もすべて読み込まれるのでこれでOKなのだけど、Turnipの場合は勝手には読んでくれないので、以下のように明示的にRSpecに取り込む必要がある。

module Codebreaker
  class Output
  end
end
RSpec.configure { |c| c.include CodeBreaker }

この本の中ではOutputは標準出力のスタブのような役割をしているのだけど、そもそもstepファイルの中にこんな感じに加えてしまうのはオッケーなのかな??