ちょっとの手間でRSpecの出力をキレイにするためにnamed_letというのを書いてみた
RSpecの話です。
RSpecは、テストコードがそのまま仕様を記述するドキュメントになる、というのが大きな利点の一つです。
しかし、rspecコマンドに-dオプションを渡して出力されるドキュメントは、必ずしも読める文章になっているとは限りません。
例として、以下のようなCanCanのspecを見てみます。
require 'spec_helper' require "cancan/matchers" describe Ability do context 'an user' do let(:user) { Factory.create(:user) } let(:article) { Factory.create(:article) } let(:own_article) { Factory.create(:article, :user => user) } subject { Ability.new(user) } it { should be_able_to(:read, article) } it { should be_able_to(:update, own_article) } end end
Userは、ある記事をreadする権限を持っていて、自分が書いた記事はupdateすることができる、という記述です。
'should be_able_to(:read, article)'や' should be_able_to(:update, own_article) 'は、そのままの文章になってます。
では、これをrspec -dで実行してみます。
アルェ?
'should be able to :read #
describe Ability do context 'an user' do let(:user) { Factory.create(:user) } named_let(:article) { Factory.create(:article) } named_let(:own_article, "own article") { Factory.create(:article, :user => user) } subject { Ability.new(user) } it { should be_able_to(:read, article) } it { should be_able_to(:update, own_article) } end end
さっきのspecで、letで定義されていたarticleを、named_letを利用するように変更しました。named_letでは、第一引数のSymbolを表示の際に利用します。第二引数に別名を渡すことも出来ます。
named_let(:article) { Factory.create(:article) } named_let(:own_article, "own article") { Factory.create(:article, :user => user) }
あらためて実行してみます。
ちゃんと意図した文章になって出力されていますね。やったー。