読者です 読者をやめる 読者になる 読者になる

Anonymous Function

tmaesaka の lifelog | カルチャー、ときどきテクノロジー

minitest で RSpec っぽくテストを書く方法

このエントリは刻々と変化する RSpec の作法や暗黙のルールに疲れた人むけです。

f:id:Maesaka:20150527203015p:plain

テストフレームワークとして人気のある RSpec ですが、しばらく使っていると非本質的な話に振り舞わされて疲れることがあります。インターネット上の情報も早いペースで古くなりがちです。こういった事情により RSpec から標準のテストフレームワークに出戻る、あるいは移行するデベロッパが増えていると聞きます。

移行すると Example Group が恋しくなる

RSpec でテストを書いていると example group を使ってテスト対象を細かく絞ったり、対象の状態に応じたテストを書くことがよくあります。そうすることによって、仕様書のように綺麗なテストが出来上がるからです。

describe SomeModel do
  describe '#func_foo' do
    context 'without xxx' do
      it 'fails to validate' do
        expect(...).to_not be_valid
      end
    end
  end
end

RSpec から離れたいけど、上記のようなテストを書き続けたいと考える人は少なくないと思います。実際にこういう声もあります。

MiniTest::Spec の出番

Ruby 1.9.2 から標準で搭載されている MiniTest::Spec を使うと、RSpec と同じようにテストを書けるようになります。

describe SomeModel do
  it 'test case A' do
    assert true
  end

  it 'test case B' do
    assert true
  end

  describe 'nested group' do
    it 'test case C' do
      assert true
    end
  end
end

RSpec 風にテストを構成できるだけでなく、Assertion の代わりに Expectations を使うことも可能です。

context キーワード

残念ながら MiniTest::Spec は context キーワードを提供しません。どうしても欲しければ、alias_method :context, :describe といった monkey patch で対応できそうですが、おすすめはしません。

ここまで来ると RSpec で良いじゃんと突っ込まれそうですが、ころころ変わる作法にとらわれないための第 1 歩としてはアリじゃないでしょうか。