( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

ちょっとの手間で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で実行してみます。


f:id:yuroyoro:20120110174348p:image:w640


アルェ?
'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) }


あらためて実行してみます。


f:id:yuroyoro:20120110174349p:image:w640


ちゃんと意図した文章になって出力されていますね。やったー。