2011-01-16 8 views
19

Naprawdę podoba mi się sposób, w jaki RSpec jest w stanie oddzielić kontroler i wyświetlić testy, ale mają problemy z dopasowaniem kapibara do testu widoku. Co ja w zasadzie starają się osiągnąć to czegoś takiego:Rspec zobacz testowanie z capybara i rails3

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 

Widziałem kilka postów na temat sieci pokazujący jak skonfigurować kapibary i rails3 sprawnie pracować z ogórka lub rspec testów kontrolerów, ale nie jest to co Chcę - czyli testować widoki na najniższym możliwym poziomie.

Również, jeśli jest inny sposób na zrobienie tego (nie wymagający dużej ilości niestandardowego kodu, bo wiem, że mógłbym napisać kilka matcherów, które wyodrębniają dane selektory z renderowanych przy użyciu nokogiri lub jakiegokolwiek innego odpowiedniego narzędzia), które też byłyby świetne - za pomocą kapibary nie jest wymogiem.

Odpowiedz

1

Na dole tej strony, w sekcji „Webrat i Kapibara”, wygląda na to, Kapibara jest obsługiwana dla rspec widok widowisko

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

+1

Prawidłowe. Jeśli użyjesz domyślnego sterownika Capibary (': test_testu'), zapisanie twoich testów widoku jako" testów prośby "z Capybarą powinno przy okazji zapewnić całkiem dobrą wydajność. Tak zasadniczo testuję swoje poglądy. Po prostu nie używasz 'assign', więc masz trochę mniej kontroli w porównaniu do" prawdziwych "testów widoku. –

11

Kapibara aktualnie nie działa z widokiem specyfikacji (istnieją planuje sprawić, by działało w przyszłości). Najprostszą odpowiedzią jest dodanie do Gemfile gem 'webrat' i jesteś właściwie ustawiony. Możesz nie mieć have_button, ale będziesz mieć have_selector, have_tag i podobne dostępne.

Przy okazji: o ile wiem, kapibara i webrat mogą współistnieć w jednym projekcie.

+0

Ten naprawdę powinien być przyjęty jako odpowiedź. :-) – sheldonh

+0

Czy ktokolwiek miał problemy z wyłapywaniem matek Capybary do testów widzenia? –

+0

Tylko uwaga dla nikogo przeszkodą w tych dniach: Kapibara obsługuje teraz obejrzeć widowisko: https://github.com/jnicklas/capybara/blob/master/README.md#using-capybara-with-rspec – tgf

17

Istnieje obecnie możliwość korzystania z mataczyk Capybara (bez bagażu Webrat) podczas testowania kontrolerów (i widoków). Używam go w ten sposób:

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 

Pełny kod:

Referencje:

+0

To jest niesamowite - świetna odpowiedź! –

+1

Naprawdę nie polecam testowania takich kontrolerów. Na podstawie tego przykładu ten rodzaj testu pasuje lepiej na poziomie widoku. –

+0

W pełni się zgadzam! Specyfikacja kontrolera powinna sprawdzać logikę sterownika, a nie widoki. Jeśli chcesz przetestować widoki, utwórz specyfikacje żądań/funkcji (używając Capybara + Poltergeist lub capybara-webkit). –

9

Nieco prostsza niż odpowiedź Pawła, ale istota jest taka sama; następujące prace dla mnie z szynami 3.1.0, 2.6.0, Kapibara rspec 1.1.1:

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

Nie można wywołać metody kapibary w sprawie rendered, to tylko ciąg. Możesz użyć Capybara's string method, aby owinąć rendered w węźle Capybara.Następnie można wywołać metody Kapibara dotyczące tego węzła:

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

Aby uzyskać więcej informacji, sprawdź ten wpis:

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

0

Można również użyć capybara składni

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

Aktualizowanie to stare pytanie, ponieważ rzeczy się zmieniły od czasu dodania większości innych odpowiedzi:

Kapibara obsługuje teraz specyfikacje widoku (od razu po wyjęciu z pudełka) i jest to udokumentowane na Capybara's master branch.

Cytując docs:

Wreszcie dopasowujących kapibary są obsługiwane w widoku Specyfikacja:

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 

Wsparcie dla nich bez dodatkowych let(:page) kodu styl wydaje się, że zostały dodane we wcześniejszej wersji. (Działa to dla mnie w kapibarze 2.4.4 i 2.2).
Należy również pamiętać, że obsługiwane są tylko ograniczone podzestawy matcherów; jednak można uzyskać więcej funkcji za pomocą Capybara.string; np .:

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