2009-04-06 17 views
10

Estoy creando algunas gemas que se pueden usar dentro de los controles y vistas de Rails. Me gustaría poder probar las gemas de forma independiente. Pero no he podido averiguar cómo crear una instancia de Rails dentro de la gema para probar que la gema funcionará dentro de una aplicación de Rails.Probando Ruby Gems en Rails

Yo prefiero usar RSpec, pero probablemente podría adaptar una solución Test :: Unit, o simplemente usar Test :: Unit.

También me interesarían soluciones similares para los complementos de Rails.

(He intentado buscar en Google, pero "rieles prueba joya" me muestra gemas que se utilizan para las pruebas, no la forma de probar una joya. Estoy bastante seguro de que he visto un artículo o 2 sobre este tema.)

Respuesta

12

Eche un vistazo a otros complementos (plugins y gemas, lo mismo) suites de prueba.

La prueba de complementos que mejora Active Record es bastante fácil. Puede use Active Record anywhere, por lo que todo lo que tiene que hacer en ese caso es conectar Active Record a una base de datos (por ejemplo, una base de datos sqlite en memoria) y probar su codez.

# test/test_helper.rb 
$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib') 
require 'your_thing' 

ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:") 

ActiveRecord::Schema.define(:version => 1) do 
    create_table :posts do |t| 
    t.string :title 
    t.text :excerpt, :body 
    end 
end 

class Post < ActiveRecord::Base 
    validates_presence_of :title 
end 

# test/my_test.rb 
require 'test_helper' 

class MyTest < Test::Unit::TestCase 
    def test_thing 
    # use Post here 
    end 
end 

Se pone más difícil cuando se desea probar las acciones del controlador y tal. My live validations plugin tiene un conjunto de pruebas muy extenso que se burla de muchas cosas y me permite pasar las vistas de ERb como una cadena, podría echar un vistazo a eso.

La adaptación de estos ejemplos de Test :: Unit a RSpec debe ser trivial, ya que no se aprovechan de nada en Test :: Unit.

+0

Esto fue muy útil; ¡Gracias! ¿Hay alguna manera de mantener cargado ActiveRecord (ala spec_server o spork) para que cargar ActiveRecord y crear la base de datos cada vez no disminuya tanto mis pruebas? – Chinasaur

+0

Estoy seguro de que hay una manera de hacerlo. Si utiliza el almacenamiento de archivos sqlite3, en lugar del almacenamiento de memoria como usa mi complemento de validación en vivo, puede verificar si el archivo de base de datos .sqlite3 existe y no ejecutar las migraciones si lo hace, etc. –

+0

Esto funcionó bastante bien para mí, solo un par notas: 1) Tuve que agregar mi marco de prueba (rspec) y sqlite3 como dependencias de desarrollo en mi gemspec (y por supuesto los rieles como una dependencia de tiempo de ejecución), 2) Necesito 'rails' y 'active_record' en mi asistente de prueba como bien –

Cuestiones relacionadas