2009-12-12 6 views
1

J'écris spécifications pour View, qui a un menu (qui est dans un partiel) rendu dans la mise en page. Je veux écrire des spécifications pour le menu sélectionné. Voici le codeRspec partiels problème

it "should have User Administration link" do 
    template.stub!(:render).and_return(:partial => "layouts/admin/menu") 
    do_render 
    #render :partial => "layouts/admin/menu" #do 
    response.should have_tag('div.menu1') 
    response.should have_tag('ul') do 
     response.should have_tag('li')do 
     with_tag("a[href=?]", admin_users_path) 
     end 
    end 
    end 

Cette spécification échoue. Je ne reçois pas la bonne façon d'écrire les spécifications pour les partiels, j'ai essayé avec: template.should_receive(:render).with(:partial => "/layout/admin/menu") aussi.

Merci et salutations, Pravin.

+0

Quelle est la définition de "do_render"? –

Répondre

2

Je ne pense pas que cette ligne:

template.stub!(:render).and_return(:partial => "layouts/admin/menu") 

est en train de faire ce que vous pensez qu'il fait. RSpec ne va pas appeler template.render: partial => "layouts/admin/menu". Il va simplement sortir le rendu et retourner {: partial => "layouts/admin/menu"} quand le rendu est appelé. Pourquoi le rendu de stub? Vous voulez que la vue s'affiche réellement pour que le corps de la réponse possède les données que vous voulez tester, à moins que je ne manque quelque chose, ce que je peux être. :)

+0

En ce qui concerne pourquoi rendre stub du tout, vous ne devriez pas parce que c'est dangereux. Votre modèle pourrait commencer à faire des appels à render() et votre spécification ne les attrapera pas. – jtanium

+1

Ignorer mon commentaire ci-dessus, voici ce qu'il faut dire: Pour ce qui est de la raison pour laquelle stub rend le tout, c'est la différence subtile entre spécification et test. Le template doit avoir une spec qui définit * exactement * ce qu'il fait, et le partial devrait avoir sa propre spécification qui définit * exactement * ce qu'il fait. – jtanium

1

Je réalise que c'est une vieille discussion, mais je suis tombé dessus tout en ayant un problème similaire, alors peut-être que ma solution aidera quelqu'un d'autre.

Mon problème était que j'étais ma méthode moqueuse n'a pas été appelée parce que je n'ai pas obtenu le "avec" droite. Voici ce que j'avais, ce qui ne fonctionnait pas:

# widgets/new.html.erb 
<% form_for(@widgets) do |f| %> 
    <%= render :partial => "form", :locals => {:f => f} %> 
    <%= f.submit "Create" %> 
<% end %> 

# widgets/new.html.erb_spec.rb 
describe "widgets/new.html.erb" do 
    let(:widget) { @widget ||= Widget.new } 
    it "displays a form" do 
    template.should_receive(:render). 
     with(:partial => "form"). 
     and_return("<span id=\"rendered-form\"/>") 
    render 
    response.should have_tag("form[method=?][action=?]", "put", widget_path(widget)) do |form| 
     form.should have_tag("span[id=?]", "rendered-form") 
     form.should have_tag("input[type=?][value=?]", "submit", "Create") 
    end 
    end 
end 

Bien sûr, il est évident maintenant pourquoi il ne fonctionnait pas, je demandais:

render :partial => "form", :locals => {:f => f} 

Mais mon spec se moquait:

render :partial => "form" 

Donc, naturellement, ma méthode simulée ne serait pas appelée. Une fois que je me suis rendu, je commencé à essayer de se moquer form_for, et toutes sortes d'autres choses, mais la solution est beaucoup plus facile:

template.should_receive(:render). 
    with(hash_including(:partial => "form")). 
    and_return("<span id=\"rendered-form\"/>") 

hash_including() était ce qui manquait.

Alors peut-être que votre problème est similaire: vous ne vous moquez pas vraiment de ce que vous pensez que vous vous moquez.