2011-01-16 12 views
19

Mi piace molto il modo in cui RSpec è in grado di separare il controller e visualizzare i test, ma ha qualche problema nel far funzionare capybara matchers in un test di visualizzazione. Quello che ho fondamentalmente cerco di realizzare è sth come questo:Rspec visualizza i test con capibara e binari3

describe "some page" do 
    it "should render with lots of stuff" do 
    assign .. 
    render 
    rendered.should have_button ('Any button') #or any capybara matcher, really 
    end 
end 

Ho visto alcuni messaggi in rete che mostra come configurare capibara e Rails3 di lavorare senza problemi con cetriolo o test del controller RSpec, ma questo non è proprio quello Voglio, cioè testare le visualizzazioni al livello più basso possibile.

Anche se c'è un altro modo per farlo (non richiede un sacco di codice personalizzato, couse so che potrei scrivere alcuni matcher che estraggono i selettori dati dal rendering usando nokogiri o qualunque strumento adatto) sarebbe bello anche - usando capibara non è un requisito

risposta

1

Nella parte inferiore della pagina, nella sezione "Webrat e Capybara", sembra Capybara è supportato per vista RSpec specifiche

http://relishapp.com/rspec/rspec-rails

+1

Corretto. Se si utilizza il driver predefinito di Capybara (': rack_test'), la scrittura dei test di visualizzazione come" test di richiesta "con Capybara dovrebbe comunque fornire prestazioni ragionevolmente buone. È come essenzialmente collaudo le mie opinioni. Semplicemente non puoi usare 'assign', quindi hai un po 'meno controllo rispetto ai test di visualizzazione" reali ". –

11

Capybara attualmente non funziona con Vista spec (ci sono prevede di farlo funzionare in futuro). La risposta più semplice è semplicemente aggiungere gem 'webrat' al Gemfile e in pratica sei impostato. Potresti non avere have_button ma avrai have_selector, have_tag e simili disponibili.

Btw: per quanto ne so, capibara e webrat possono coesistere in un unico progetto.

+0

Questo dovrebbe essere accettato come risposta. :-) – sheldonh

+0

Qualcuno ha avuto problemi con gli abbinamenti di Capybara che sono stati esaminati? –

+0

Solo una nota per chiunque inciampi in questi giorni: Capybara supporta ora le specifiche di visualizzazione: https://github.com/jnicklas/capybara/blob/master/README.md#using-capybara-with-rspec – tgf

17

Vi è ora un'opzione per utilizzare gli abbinamenti Capybara (senza bagaglio Webrat) quando si testano i controller (e anche le viste). Sto usando in questo modo:

describe GlobalizeTranslationsController do 

    render_views 
    let(:page) { Capybara::Node::Simple.new(@response.body) } 

    describe "PUT :update" do 
    before do 
     put :update 
    end 

    it "displays a flash notice" do 
     page.should have_selector('p.notice') 
    end 

    end 

end 

codice completo:

Riferimenti:

+0

Questo è fantastico - Bella risposta! –

+1

Non consiglio davvero di testare controller come quello. Usando il tuo esempio, quel tipo di test si adatta meglio al livello di vista. –

+0

Pienamente d'accordo! Le specifiche del controller devono solo testare la logica del controller, non le viste. Se si desidera testare le viste, creare richieste/caratteristiche specifiche (utilizzando Capybara + Poltergeist o capybara-webkit). –

9

Leggermente più semplice di risposta di Pawel, ma il succo è lo stesso; le seguenti opere per me con le rotaie 3.1.0, 2.6.0, rspec Capybara 1.1.1:

page = Capybara::Node::Simple.new(rendered) 
page.should have_content("blah") 
3

Non è possibile chiamare i metodi di Capybara su rendered, che è solo una stringa. È possibile utilizzare Capybara's string method anche per avvolgere rendered in un nodo Capybara.Quindi, è possibile chiamare i metodi di Capybara su quel nodo:

describe "some page" do 
    it "should render with lots of stuff" do 
    assign .. 
    render 
    Capybara.string(rendered).should have_button('Any button') 
    end 
end 

Per ulteriori informazioni, controllare questo post:

http://www.tamingthemindmonkey.com/2011/11/07/capybara-matchers-and-scoping-in-view-specs

0

È inoltre possibile utilizzare capibara sintassi

describe "some page" do 
    it 'should render hello with name' do 
    assign(:user, double("User", first_name: "John")) 
    render 
    expect(rendered).to have_content("Hello John") 
    end 
end 
1

Aggiornamento questa vecchia domanda come le cose sono cambiate dal momento che la maggior parte delle altre risposte sono state aggiunte:

Capybara ora supporta le specifiche di visualizzazione (fuori dalla scatola) e questo è documentato su Capybara's master branch.

Per citare la documentazione:

Infine, matchers Capybara sono supportati in vista specifiche:

RSpec.describe "todos/show.html.erb", type: :view do 
    it "displays the todo title" do 
    assign :todo, Todo.new(title: "Buy milk") 

    render 

    expect(rendered).to have_css("header h1", text: "Buy milk") 
    end 
end 

Il supporto per questi senza ulteriore let(:page) codice di stile sembra essere stato aggiunto in una versione precedente. (Funziona per me in Capybara 2.4.4 e 2.2).
Si noti inoltre che è supportato solo un numero limitato di abbinamenti; tuttavia è possibile ottenere più funzionalità utilizzando Capybara.string; es:

expect(Capybara.string(rendered).first('td')).to have_no_content 'Tom Riddle'