この記事は移動しました。
久しぶりのサンフランシスコ
この記事は移動しました。
熱中症でダウンしました
この記事は移動しました。
ロードバイクのタイヤチューブ交換
この記事は移動しました。
minitest で RSpec っぽくテストを書く方法
このエントリは刻々と変化する RSpec の作法や暗黙のルールに疲れた人むけです。
テストフレームワークとして人気のある RSpec ですが、しばらく使っていると非本質的な話に振り舞わされて疲れることがあります。インターネット上の情報も早いペースで古くなりがちです。こういった事情により RSpec から標準のテストフレームワークに出戻る、あるいは移行するデベロッパが世界中で増えていると聞きます。
移行するといっても、いざコードを書きはじめてから minitest のシンプルすぎる構文に戸惑う人もいるでしょう。そういった人たちのために、なるべく慣れ親しんだテスト構成を標準ライブラリで組む方法を紹介します。
Example Group が恋しくなる
RSpec を使っていると example group を使ってテスト対象を細かく絞ったり、対象の状態に応じたテストを書くことがよくあります。そうすることによって、仕様書のように綺麗なテストが出来上がるからです。Model spec なんかは解りやすい例ですね。
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 から離れたいけど、上記のようなテストを書き続けたいと考える人は少なくないと思います。実際にこういう声もあります。
@hotchpotch @tmaesaka 僕らの欲しかったのは context のある minitest だ感がある
— ヨシオリ@惑星ホス (@yoshiori) May 27, 2015
MiniTest::Spec の出番
Ruby 1.9.2 から標準で搭載されている MiniTest::Spec を使うと RSpec 風にテストを書けるようになります。有効にするには test_helper.rb などで require 'minitest/spec'
します。
describe SomeModel do it 'test case A' do assert true end describe 'nested group A' do it 'test case B' do assert true end end end
有効にすると上記のように RSpec 風にテストを構成できるだけでなく、Assertion の代わりに Expectations を使うことも可能です。
context メソッド
残念ながら MiniTest::Spec
は context メソッドを提供してくれません。どうしても欲しければ alias_method :context, :describe
的な monkey patch で無理やり対応できそうですが、おすすめはしません。
ここまで来ると RSpec で良いじゃんと突っ込まれそうですが、ころころ変わる作法にとらわれないための第 1 歩としてはアリじゃないでしょうか。
お米が主役の「恵比寿 米福」
この記事は移動しました。
Increments の道玄坂オフィスに行ってきた話
友人の誘いで Qiita や Qiita:Team などを運営する Increments 社にお邪魔してきました。
道玄坂に移転してから日も浅いということで、外部の人たちが参加する初の TGIF でした。まとめると、全文検索のチューニング、Markdown パーサ拡張、インフラストラクチャ移行、ServiceWorker、キーワード抽出など、濃厚な話をピザを食べながらしました。この充実した時間、さすがデベロッパーを支える Increments の空気です。
今回の集まりで Chrome 42 から対応される Push Notification を Epitome に実装するきっかけを得たので、近日中に最先端を走る利用者むけに実装します。うまくいったら、それを足がかりに ServiceWorker を使ったコンテンツの先読みに挑戦するかも。