(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

RSpecでパラメタライズドテストを書く

書く必要あんのかって感じもありつつ、なんとなくこう書きたいから書いた!っていう感じ。

例えばこんな感じ。

subject { FactoryGirl.build(:people, params) }
0.step(100, 10) do |n|
  context "#{n}の場合" do
    let(:params) { {age: n} }

    it '正常に更新出来ること' do
      expect(subject).to have(0).errors_on(:age)
    end
  end
end

普通にRubyの構文で書けるから、苦労しないしいい感じ。
ただ、問題があるとしたらそれ用のDSLではないので、若干RSpecが読みにくくなるのかなーとか。

で、上の例だけだとパラメタライズドぽくないので、もう少し凝ってみた。
パラメタライズドテストというと期待値と実測値のペアが幾つかあって、それぞれの値を検証するというのが普通だと思うのでそう書いてみた。

検証する対象のコードはこれ。何処にでもあるFizzBuzz

class FizzBuzz
  def self.fizzbuzz n
    case
    when n % 15 == 0
      "FizzBuzz"
    when n % 5 == 0
      "Buzz"
    when n % 3 == 0
      "Fizz"
    else
      n
    end
  end
end

実際のテストコードはこれ。

require 'spec_helper'

describe FizzBuzz do
  describe '.fizzbuzz' do
    subject { described_class.fizzbuzz n }

    context '正常終了するパターン' do

      where =
        [
         [1, 1],
         [3, 'Fizz'],
         [5, 'Buzz'],
         [15, 'FizzBuzz']
        ]

      where.each do |n, expect_value|
        context "#{n}の場合" do
          let(:n) { n }
          it "#{expect_value}になること" do
            expect(subject).to eq expect_value
          end
        end
      end
    end
  end
end

それなりにいい感じじゃないかなーとかなんとか。
で、これをいい感じにDSL化したものがgemであるんだって!ステキ。

でも、正直こうなんというか、いるかと言われたら微妙だなって少しだけ思ってしまった。まぁそんな話でした。