rack_test - Escribiendo una especificación para ayudante con Ruby on Rails y RSpec
ruby capybara github (5)
Analizar html con expresiones regulares realmente está reinventando la rueda. Eso es demasiado trabajo para mí: demasiado inflexible y demasiado propenso a errores. (Vea esta respuesta sarcástica pero hilarante y precisa de SO sobre el razonamiento)
Si necesita analizar la salida html de sus ayudantes, puede probar la gema rspec-html-matchers . A diferencia de webrat, parece jugar bien con RSpec 3.
Entonces tú puedes:
expect(helper.title).to have_tag(''title'', text: ''What you expect'')
He estado escribiendo especificaciones para controladores y modelos, pero nunca he escrito una especificación de ayuda. No tengo idea de por dónde empiezo.
Tengo el siguiente fragmento de código en application_helper.rb
def title(page_title)
content_for(:title) { page_title }
end
- ¿Cómo debo escribir una especificación de ayuda en el código?
- Además, si hay alguna aplicación de código abierto de Rails para mostrar las pruebas / especificaciones de un buen ayudante, hágamelo saber.
De los documentos de rspec-rails en las especificaciones de ayuda :
Las especificaciones de los ayudantes viven en spec / helpers, y se mezclan en ActionView :: TestCase :: Behavior.
Proporciona un objeto auxiliar que se mezcla en el módulo auxiliar que se especificó, junto con ApplicationHelper (si está presente).
require ''spec_helper''
describe ApplicationHelper do
describe "#title" do
it "displays the title" do
# helper is an instance of ActionView::Base configured with the
# ApplicationHelper and all of Rails'' built-in helpers
expect(helper.title).to match /Some Title/
end
end
end
Es posible usar esta sintaxis cuando especifique ayudantes
Supongamos que este es tu ayudante
module ApplicationHelper
def page_title
@title || nil
end
end
Entonces puedes especificarlo con esta sintaxis.
require "spec_helper"
describe ApplicationHelper do
describe "#page_title" do
it "returns the instance variable" do
assign(:title, "My Title")
helper.page_title.should eql("My Title")
end
end
end
RSpec debería cargar automáticamente las clases y los módulos de su entorno de rieles cuando los "describe", por lo que una especificación de ayudante válida podría ser:
#deleted
Pero recuerde que bdd no está probando todos los métodos, sino el comportamiento de su aplicación.
editar:
como dijo @Ken, mi especificación no era correcta, definitivamente era la forma incorrecta de hacerlo. Así que saqué una solución de especificaciones de solicitud que me gusta más que una especificación de ayudante.
# inside your helper
def title=(page_title)
content_for(:title) { page_title }
end
# views/resource/index.html.erb
<% title = "foo" %>
# views/layouts/application.html.erb
<%= yield :title %>
# request spec
require ''spec_helper''
describe YourResource do
it "should output content for title"
get "/resource"
response.body.should =~ /<title>foo<//title>/
end
end
de lo contrario, si desea probar solo el comportamiento del ayudante (porque es crítico o porque no tiene ninguna opinión) @ la solución de Ken es mejor.
También es posible incluir a su ayudante dentro de la clase de prueba de la siguiente manera:
describe ApplicationHelper do
helper ApplicationHelper
it "should work" do
my_helper_method("xyz").should == "result for xyz"
end
end
Trabajó para mí con Rails 3.