2009-09-25 5 views
3

Je suis en train de tester la méthode de bloc HTML dans l'aide de rails:output_buffer est nulle sur spec aide

def dashboard_widget(header, &proc) 
    concat('<div class="dashboard-widget">') 
    etc 
end 

Le code fonctionne parfaitement dans l'environnement de développement, mais le test suivant est Failed:

it "should be created" do 
    helper.dashboard_widget('My widget') do 
    "hello world" 
    end.should be_true 
end 

Avec la stacktrace suivante:

d:/s/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_view/helpers/text_helper.rb:32:in `concat' 
D:/makabu/medved/winvest/master/app/helpers/dashboards_helper.rb:6:in `dashboard_widget' 
./spec\helpers\dashboards_helper_spec.rb:13: 
d:/s/ruby/lib/ruby/gems/1.8/gems/rspec-1.2.8/lib/spec/example/example_methods.rb:40:in `instance_eva 
l' 
d:/s/ruby/lib/ruby/gems/1.8/gems/rspec-1.2.8/lib/spec/example/example_methods.rb:40:in `execute' 

S'il vous plaît, suggérer ce que je fais mal?

Merci.

Répondre

7

Il y a une méthode RSpec pour les aides d'essai qui concaténer sortie au lieu de le retourner:

output = eval_erb("<% helper.dashboard_widget('My widget') { 'hello world' } %>") 
output.should be_happy # meaningful statement goes here 

C'est la meilleure façon d'aborder les blocs qui ont HTML à partir de votre point de vue:

output = eval_erb <<-HTML 
    <% helper.dashboard_widget('My widget') do %> 
    <h1>Widget</h1> 
    <p>Hello World, this is my cool widget</p> 
    <% end %> 
HTML 

Cependant , J'ai trouvé un moyen plus propre de tester les helpers qui utilisent concaténer, mais n'utilise pas HTML dans le bloc:

before :each do 
    helper.output_buffer = '' 
end 

it "should be awesome" 
    helper.dashboard_widget 'My widget' do 
    :awesome 
    end 

    helper.output_buffer.should match(/awesome/) 
end 

Enregistre la nécessité d'avoir des chaînes ERB construites dans la spécification, mais pas utile dans toutes les situations.