test rails ruby-on-rails-3 configuration rspec capybara matcher

ruby-on-rails-3 - test - rspec rails 5



Rspec view testing con capibara y rieles3 (7)

Realmente me gusta la forma en que RSpec puede separar el controlador y ver las pruebas, pero tiene algunos problemas para que los emparejadores de capibara funcionen en una prueba de vista. Lo que básicamente trato de lograr es algo como esto:

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

He visto algunas publicaciones en la red que muestran cómo configurar capybara y rails3 para que funcionen sin problemas con las pruebas de control de pepino o rspec, pero esto no es realmente lo que quiero, es decir, probar las vistas al nivel más bajo posible.

Además, si hay otra forma de hacer esto (no requiere mucho código personalizado, porque sé que podría escribir algunos concordantes que extraigan determinados selectores del renderizado usando nokogiri o cualquier herramienta adecuada) también sería genial, usar capibara no es un requisito .


Actualizando esta vieja pregunta ya que las cosas han cambiado desde que se agregaron la mayoría de las otras respuestas:

Capybara ahora admite especificaciones de vista (fuera de la caja) y esto está documentado en github.com/jnicklas/capybara/blob/master/… .

Para citar los documentos:

Finalmente, los emparejadores de capibara son compatibles con las especificaciones de vista:

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

El soporte para estos sin el código adicional de estilo let(:page) parece haberse agregado en una versión anterior. (Funciona para mí en capibara 2.4.4 y 2.2).
Tenga en cuenta también que solo se admite un subconjunto limitado de coincidencias; sin embargo, puede obtener más funcionalidad utilizando Capybara.string ; ex:

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


Actualmente, Capybara no funciona con las especificaciones de vista (hay planes para que funcione en el futuro). La respuesta más simple es simplemente agregar gem ''webrat'' al Gemfile y ya está básicamente configurado. Es posible que no tenga el have_button pero que tenga have_selector , have_tag y similar disponible.

Por cierto: por lo que sé, Capybara y Webrat pueden coexistir en un proyecto.


Ahora hay una opción para usar los emparejadores de Capybara (sin el equipaje de Webrat) al probar los controladores (y las vistas también). Lo estoy usando de esta manera:

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

Código completo:

Referencias:


En la parte inferior de esta página, en la sección "Webrat and Capybara", parece que Capybara no es compatible con las especificaciones de la vista rspec

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


No puedes llamar a los métodos de capybara en rendered , eso es solo una cadena. Puede utilizar el método de cadena de Capybara para envolver rendered en un nodo de Capybara. Luego, puedes llamar a los métodos de Capybara en ese 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

Para más información, echa un vistazo a esta publicación:

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


También puedes usar la sintaxis de capibara.

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


Un poco más simple que la respuesta de Pawel, pero la esencia es la misma; los siguientes trabajos para mí con rieles 3.1.0, rspec 2.6.0, capybara 1.1.1:

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