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であるんだって!ステキ。
でも、正直こうなんというか、いるかと言われたら微妙だなって少しだけ思ってしまった。まぁそんな話でした。