Testando helpers de bloco no RSpec


Leia em menos de um minuto

Uma coisa que gosto de fazer nos helpers é encapsular o conteúdo utilizando blocos.

# spec/fixtures/views/main.html.erb
<% main do %>
    This is the main content!
<% end %>

Para utilizar a sintaxe acima, basta criar um helper como este:

# app/helpers/application_helper.rb
def main(&block)
  concat content_tag(:div, capture(&block), :class => "main")
end

Não existe nenhuma maneira específica de testar esse tipo de helper; algumas pessoas sugerem criar um teste de view, enquanto outros escrevem verdadeiras gambiarras para fazer isso no próprio arquivo de testes de helpers. A maneira mais simples é derivada do teste de view.

Primeiro, crie uma view no diretório spec/fixtures/views/main.html.erb; esse caminho não existirá, então você precisará criá-lo. Agora, crie o arquivo de specs em spec/views/main.html.erb_spec.rb. O segredo está em adicionar um novo path de busca de views. Isso pode ser feito com o método ActionController::Base.prepend_view_path.

Veja como ficará seu arquivo de teste.

require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")

ActionController::Base.prepend_view_path RAILS_ROOT + "/spec/fixtures/views"

describe "Containers" do
  it "should render main helper" do
    render "main.html.erb"
    response.body.should have_tag("div.main", 1)
    response.body.should have_tag("div.main", "This is the main content!")
  end
end

Nada como a simplicidade!