RSpec をやめて Test::Unit に戻る

最近の RSpec は、それまで

obj.stub(hoge: value)

と書けたものが、

allow(obj).to receive(:hoge).and_return value

と書かないといけなくなったりとか、正気の沙汰とは思えないような変更をしたりするので、何年かぶりに Test::Unit を使ってみようとリハビリ中です。

RSpec は、テストケースを入れ子にできたり、テストケースや example がクラスやメソッドではなく、文字列で自由に書くことができたりしたのが良かったのですが、最近の Test::Unit ではそれもできるようになっています。

[ruby-list:48926] [ANN] test-unit 2.5.2

このリリースはとみたさんに使ってもらえるように改良したリリー スです。新しく追加した--locationはRSpecの--line_numberと似た 機能です。sub_test_caseはshoulda-contextとRSpecのcontextと似 た機能です。これらの機能があればtest-unit 2に乗り換えてくれ ると聞いたので実装しました。

2年もたってやっと使い始めました。すいません…。

準備

% gem install test-unit

テスト

RSpec で次のように書いてたテストは、

describe Array do
  context '空の場合' do
    before do
      @array = []
    end
    it 'size が 0' do
      expect(@array.size).to eq 0
    end
  end
  context '要素が1つの場合' do
    before do
      @array = ['hoge']
    end
    it 'size が 1' do
      expect(@array.size).to eq 1
    end
  end
end

Test::Unit だと次のように書けます。

require 'test/unit'

class TestArray < Test::Unit::TestCase
  sub_test_case '空の場合' do
    setup do
      @array = []
    end
    test 'size が 0' do
      assert_equal 0, @array.size
    end
  end
  sub_test_case '要素が1つの場合' do
    setup do
      @array = ['hoge']
    end
    test 'size が 1' do
      assert_equal 1, @array.size
    end
  end
end

一番外側は Test::Unit::TestCase を継承してクラスを作成する必要がありますが、そのクラスの中は sub_test_case を使って任意の文字列でテストケースを記述できます。

RSpec の describe, context と同様に sub_test_case は入れ子にもできます。 ただし、test に指定する文字列がまったく同じだと後で定義した方は無視されてしまうようなので注意しましょう。

デスクトップ通知

gem で test-unit-notify をインストールして、スクリプトの先頭で

require 'test/unit/notify'

と書いておくと、デスクトップ通知で結果を知らせてくれて便利です。

f:id:tmtms:20141012233534p:plain

stub

stub は、test-unit-rr をインストールして、スクリプトの先頭で

require 'test/unit/rr'

としておき、次のように記述することができます。

stub(obj).hoge{value}   # obj の hoge メソッドが value を返す

RSpec よりもシンプルに書けて良いです。