最近の 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'
と書いておくと、デスクトップ通知で結果を知らせてくれて便利です。
stub
stub は、test-unit-rr をインストールして、スクリプトの先頭で
require 'test/unit/rr'
としておき、次のように記述することができます。
stub(obj).hoge{value} # obj の hoge メソッドが value を返す
RSpec よりもシンプルに書けて良いです。