2009-06-12 7 views
10

Estoy agregando más pruebas rspec a mi aplicación y me gustaría probar un módulo ScoringMethods, que está en /lib/scoring_methods.rb. Así que agregué un directorio/spec/lib y agregué scoring_methods_spec.rb allí. ¿Se requiere spec_helper y configurar el bloque de describir como tan:Agregar la prueba rspec para el módulo de la biblioteca no parece recoger Expectativas y Matchers

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') 

describe ScoringMethods do 

    describe "should have scorePublicContest method" do 
    methods = ScoringMethods.instance_methods 
    methods[0].should match(/scorePublicContest/) 
    end 
end 

Ahora methods[0] es una cadena y no hay ningún problema que coincida con el nombre de método público con la expresión regular. Y la ruta relativa a "spec_helper" es correcta.

El problema es que toda la instalación no parece utilizar la biblioteca rspec. Ejecución de los rendimientos ejemplo:

./spec/lib/scoring_methods_spec.rb:7: undefined method `match' for Spec::Rails::Example::RailsExampleGroup::Subclass_1::Subclass_1:Class (NoMethodError) 
    ... 

La totalidad de las expectativas y de apoyo Matcher parece que falta. Para probar mi suposición, cambié una especificación auxiliar de trabajo reemplazando "is_instance_of" a "is_foobar_of". Esa prueba simplemente falla y dice "is_foobar_of" no es un método del objeto específico; eso, toda esta jerarquía de Spec :: Rails :: Example ... no está presente.

He intentado utilizar otros mezcladores también. He intentado "be_instance_of" y algunos otros. Parece que no estoy incluyendo la biblioteca rspec correctamente.

Finalmente, ScoringMethods es un módulo, del mismo modo que los Helpers son módulos. Así que pensé que sería posible probar un módulo (a diferencia de las clases, como Controladores y Modelos).

Agradecería mucho sus ideas sobre lo que he hecho mal. Tal vez haya una forma más efectiva de probar los módulos de la biblioteca. ¡Gracias!

Respuesta

11

Debe incluir su bloque de prueba en un bloque "it". Por ejemplo:

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') 

describe ScoringMethods do 

    describe "should have scorePublicContest method" do 
    it "should have a scorePublicContest method" do 
     methods = ScoringMethods.instance_methods 
     methods[0].should match(/scorePublicContest/) 
    end 
    end 
end 

usted encontrará que los nombres de los métodos devueltos no están garantizados para estar en el orden que existen en el archivo.

Un modelo que solemos utilizar al probar los Módulos es incluir el módulo en una clase creada para la prueba (dentro del archivo de especificación) o incluida dentro de la especificación.

+1

Marca, Muchas gracias por responder. ¡Estás absolutamente en lo correcto! No tenía el bloque "it". Muchas gracias, Peter –

+2

Además, gracias por su opinión sobre los módulos de prueba. El módulo está incluido en una clase para exponer solo sus métodos públicos y para no obtener una gran lista de métodos devueltos al usar la llamada a métodos_instancia. De esta forma, podemos agregar nuevos métodos públicos al módulo y están disponibles para su selección en listas desplegables y similares. Usar el mismo mecanismo, como sugiere, será útil para las pruebas. –

+0

Awesome, también no había cerrado correctamente el bloque 'it'. –

Cuestiones relacionadas