2010-01-03 11 views
20

He estado escribiendo especificaciones para controladores y modelos, pero nunca he escrito una especificación de ayudante. No tengo idea de dónde empiezo.Escribiendo una especificación para ayudante con Ruby on Rails y RSpec

tengo el siguiente fragmento en application_helper.rb

def title(page_title) 
    content_for(:title) { page_title } 
    end 
  • ¿Cómo debo escribir una especificación de ayudante en el código?
  • Además, si hay alguna aplicación de Rails de código abierto para mostrar buenas pruebas/especificaciones de ayudantes, házmelo saber.

Respuesta

6

RSpec debe cargarse automáticamente las clases y módulos de su entorno rieles cuando se 'describen' ellos, por lo que una especificación de ayuda válida podría ser:

#deleted 

Pero recuerde que el TDC no está poniendo a prueba todos los métodos única, pero el comportamiento de tu aplicación.

edición:

como dijo @Ken, mi especificación no era correcto, Fue sin duda la manera equivocada de hacerlo. Así que obtuve una solución de solicitud de especificaciones que me gusta más que una especificación de Helper.

# 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 sólo desea probar el comportamiento de ayuda (porque es crítico o porque no tiene ninguna vista) @ solución de Ken es mejor.

+0

Muchas gracias por tu ejemplo. Right BDD no se trata de cubrir todos los métodos. La mayoría de los métodos de ayuda se ven afectados por la cobertura de Cucumber/Rcov. –

+4

Esto no prueba mucho ya que content_for devuelve nil. Debes renderizar una página y assert_select "title" contiene lo que esperas. –

+1

Esto no está probando un helper, esto está probando algo más, según su ejemplo, parece que está probando un archivo de vista (por ejemplo, index.html.erb). La prueba de ayuda solo debe probar el método de título # de ApplicationHelper, sin dependencias de una vista o ruta/controlador. – Percy

10

También es posible incluir 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 

a mí me funcionó con raíles 3.

9

Es posible utilizar this syntax cuando spec'ing ayudantes

Supongamos que este es su ayudante

module ApplicationHelper 
    def page_title 
    @title || nil 
    end 
end 

Entonces puede spec 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 
17

Desde el rspec-rails docs on Helper Specs:

especificaciones Helper viven en SPEC/ayudantes, y mezclar en ActionView :: TestCase :: Comportamiento.

Proporciona un objeto auxiliar que se mezcla en el módulo auxiliar que es spec'd, 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 
+0

Esta debería ser la respuesta, * gracias * –

1

análisis de HTML con expresiones regulares es realmente reinventar la rueda. Eso es demasiado trabajo para mí: demasiado inflexible y demasiado propenso a errores. (Consulte esto sarcastic but hilarious and accurate SO answer 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.

A continuación, se puede:

expect(helper.title).to have_tag('title', text: 'What you expect')