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
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" )