旧ブログ

sambaiz.net に引っ越しました

Turnip使ってみた

#language: ja
機能: FizzBuzzやる

  シナリオ: 3の倍数がきた
    もし 入力が3の倍数
    ならば 出力はFizzから始まる

  シナリオ: 5の倍数がきた
    もし 入力が5の倍数
    ならば 出力はBuzzで終わる

  シナリオ: それ以外の数がきた
    もし 入力が3の倍数でも5の倍数でもない数
    ならば 出力は与えられた数字

  シナリオ: nilとかやめろ
    もし 入力がnil
    ならば エラー

Cucumberについて調べてたら、

Rubyist Magazine - エンドツーエンドテストの自動化は Cucumber から Turnip へ

なんてのを見つけたので、Turnip使ってみました。 Cucumberに比べてstepに正規表現でなく、プレースホルダーを使うところがいいみたいです。

とりあえずFizzBuzz作ってみました。

参考: Turnip について (1) / まずは動かす - Thanks Driven Life

一番最初に載せたのがシナリオ。 #language: jaと書くと、予約語も日本語で書けるようになります。 それぞれの対応は

http://magazine.rubyist.net/?0042-FromCucumberToTurnip#l60

に載っていたCucumberのi18n機能で確認できるものとおそらく同じです。

「機能」と「シナリオ」の後の文字はただの説明で、 「もし」、「ならば」の後に来る文字は以下のstepと対応しています。

require "./fizzbuzz.rb"

step "入力が:numberの倍数" do |n|
  @num = n * 2
end

step "入力が3の倍数でも5の倍数でもない数" do
  @num = 3 * 5 - 1
end

step "入力がnil" do
  @num = nil
end

step "出力はFizzから始まる" do
  expect(fizzbuzz(@num)).to match /^Fizz/
end

step "出力はBuzzで終わる" do
  expect(fizzbuzz(@num)).to match /Buzz$/
end

step "出力は与えられた数字" do
  expect(fizzbuzz(@num)).to eq @num
end

step "エラー" do
  expect(lambda{fizzbuzz(@num)}).to raise_error
end

最初のstepではプレースホルダーを使っています。 例えば、"3の倍数"なら @num=3*2になりますし、 "5の倍数"なら@num=5*2になります。

今回のソースコード

sambaiz/first_turnip · GitHub

にあるので良かったらどうぞ。

.rspec

-r turnip

が含まれているので

bundle install --path vendor/bundle
bundle exec rspec

で動きます。