2011-08-16 11 views
22

Ho una specifica di vista che stava passando ma è rotta ora che l'impaginazione (tramite Kaminari gem) è stata aggiunta alla vista. Sto ancora cercando di capire come funziona la sintassi di RSpec ... quindi cerco aiuto per far sì che questo accada perché la pagina funziona bene nel browser. Sono consapevole che molte persone disapprovano vista specifiche per essere fragili (probabilmente per motivi come questo), ma io ancora vorrei mantenere questo passaggioTest RSPec interrotto dall'impaginazione (Kaminari)

Sto assegnando alcuni schiacciò i messaggi alla matrice @posts. Ma gli array non rispondono allo current_page. Quindi come dovrei gestirlo in RSpec?

Failures: 

    1) posts/index.html.haml renders a list of posts 
    Failure/Error: render 
    ActionView::Template::Error: 
     undefined method `current_page' for #<Array:0x000001028ab4e0> 
    # ./app/views/posts/index.html.haml:31:in `_app_views_posts_index_html_haml__291454070937541541_2193463480' 
    # ./spec/views/posts/index.html.haml_spec.rb:39:in `block (2 levels) in <top (required)>' 

spec/views/posts/index.html.haml_spec.rb:

require 'spec_helper' 

describe "posts/index.html.haml" do 
    before(:each) do 
    ... 
    assign(:posts, [ 
     Factory.stub(:post), 
     Factory.stub(:post) 
    ])  
    view.should_receive(:date_as_string).twice.and_return("June 17, 2011") 
    ... 
    end 

    it "renders a list of posts" do 
    render 
    rendered.should have_content("June 17, 2011") 
    ... 
    end 
end 
+1

ti conosco già accettato un'altra risposta, ma sono preoccupato che b y facendo lo stub che hai fatto hai appena soppresso un bug nel tuo codice. L'errore sopra implica che stai chiamando @ posts.current_page nel tuo controller. Posso vedere @ posts.first.current_page o controller.current_page essere validi, ma probabilmente @ posts.current_page non lo è. –

+0

buon punto! quindi, dovrei forse escludere il controller? Non sono del tutto sicuro di cosa Kaminari si aspetti di chiamare 'current_page' on?!? So solo che la specifica * è * fallita perché l'array posts non risponde ad esso ... ma, hai ragione, sembra strano? * Lascerò aperta per un po 'per vedere se una risposta migliore si presenta. * – Meltemi

+0

Puoi pubblicare anche il codice del controller pertinente? –

risposta

44

Si può anche fare qualcosa di simile di seguito:

assign(:posts, Kaminari.paginate_array([ 
     Factory.stub(:post), 
     Factory.stub(:post) 
     ]).page(1)) 
+2

Questo metodo si adatta bene al codice dello scaffold Rails. Basta avvolgere l'array stub_model generato con la pagina Kaminari.paginate_array (...). (1) e Viola! Specifiche di lavoro. – scarver2

+1

'Kaminari.paginate_array (...). Pagina (1)' funziona anche nel mio caso –

16

Si dovrebbe stub il comportamento, provate questo:

before(:each) do 
    ... 
    posts = [Factory.stub(:post), Factory.stub(:post)] 
    posts.stub!(:current_page).and_return(1) 
    posts.stub!(:total_pages).and_return(2) 
    assign(:posts, posts)  
    view.should_receive(:date_as_string).twice.and_return("June 17, 2011") 
    ... 
end 
+3

Brillante! Grazie! Per chiunque altro stavo guardando anche altri due metodi ': num_pages' e': limit_value' allo stesso modo di ': current_value' è sopra ... e il valore che sto restituendo per ognuno di essi è un numero intero '(1)'. Specifiche che passano nuotando ... grazie! – Meltemi

+0

Bene * I * ti farà +1. Non riesco a spuntare il segno di spunta verde :( – jaydel

+1

Ho anche dovuto eliminare 'total_pages'. Grazie! –