2009-04-06 8 views
10

Sto creando alcune gemme che possono essere utilizzate all'interno di controller e viste Rails. Mi piacerebbe essere in grado di testare le gemme in modo indipendente. Ma non sono stato in grado di capire come creare un'istanza di Rails all'interno della gemma per verificare che la gemma funzioni all'interno di un'app Rails.Testing Ruby Gems sotto Rails

Preferisco decisamente utilizzare RSpec, ma probabilmente è possibile adattare una soluzione Test :: Unit o semplicemente utilizzare Test :: Unit.

Sarei interessato anche a soluzioni simili per i plugin Rails.

(Ho provato su Google, ma "rails gem testing" mi mostra le gemme che vengono utilizzate per il test, non come testare una gemma. Sono sicuro di aver visto un articolo o 2 su questo argomento.)

risposta

12

Dai un'occhiata ad altri plugin (plugin e gemme, stessa cosa) suite di test.

Testare i plug-in che ottimizzano Active Record è piuttosto semplice. Puoi use Active Record anywhere, quindi tutto quello che devi fare in questo caso è connettere Active Record ad un database (ad esempio un database sqlite in-memory) e testare il tuo codicez.

# 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 

Diventa più difficile quando si desidera testare le azioni del controller e così via. My live validations plugin ha una suite di test piuttosto estesa che prende in giro molte cose e mi permette di passare le viste ERb come una stringa, puoi dare un'occhiata a questo.

Adattamento di questi test: Gli esempi di unità su RSpec devono essere semplici, in quanto non eseguono il porting su nulla in Test :: Unit.

+0

Questo è stato molto utile; Grazie! C'è un modo per mantenere caricato ActiveRecord (ala spec_server o spork) in modo che il caricamento di ActiveRecord e la creazione del database ogni volta non rallentino così tanto i miei test? – Chinasaur

+0

Sono sicuro che c'è un modo per farlo. Se si utilizza l'archiviazione di file sqlite3, al posto dell'archiviazione della memoria come il mio plugin di convalida live, è possibile verificare se il file di database .sqlite3 esiste e non eseguire le migrazioni se lo fa ecc. –

+0

Questo ha funzionato abbastanza bene per me, solo un paio di note: 1) Ho dovuto aggiungere il mio testing framework (rspec) e sqlite3 come dipendenze di sviluppo nel mio gemspec (e ovviamente rails come dipendenza di runtime), 2) Necessario per richiedere 'rails' e 'active_record' nel mio helper test come bene –