読者です 読者をやめる 読者になる 読者になる

ウェブサービスを作っています。

ブロック内を表示するヘルパーメソッドの作り方と RSpec によるテストの書き方

こんなの。

<% output_block_with_date do |t| %>
現在の時刻は、<%=h t %> です。
<% end %>


ヘルパー。

def output_block_with_date(&blk)
  concat capture(Time.now, &blk)
end

concat は、<%= %> と同じような意味で、ビューに文字列を出力するメソッドです。
capture は、ブロック内のテンプレートを文字列に変換するメソッドです。


テスト。

describe '#output_block_with_date' do
  before do
    Time.stub!(:now).and_return Time.local(2009)
    helper.output_buffer = ''
  end

  it 'は、現時刻を渡したブロックを出力すること' do
    helper.output_block_with_date { |t| "今年は #{ t.year }" }
    helper.output_buffer.should == '今年は 2009 年'
  end
end

ActionView::Base#output_buffer に出力内容が格納されていくっぽいので、これを活用します。
もっといい方法があったら、教えてください。