2009-04-06 7 views
10

Je crée des gemmes qui peuvent être utilisées dans les contrôleurs et les vues Rails. J'aimerais pouvoir tester les gemmes indépendamment. Mais je n'ai pas été capable de comprendre comment créer une instance de Rails à l'intérieur de la gemme pour tester que la gemme fonctionnera dans une application Rails.Test des gemmes ruby ​​sous les rails

Je préfère fortement utiliser RSpec, mais je pourrais probablement adapter une solution Test :: Unit, ou simplement utiliser Test :: Unit.

Je serais également intéressé par des solutions similaires pour les plugins Rails.

(J'ai essayé Google, mais "rails gem testing" me montre des gemmes qui sont utilisées pour tester, pas comment tester une gemme.Je suis sûr que j'ai vu un article ou 2 sur ce sujet.)

Répondre

12

Jetez un oeil à d'autres suites de tests de plugins (plugins et gemmes, même chose).

Le test de plugins améliorant Active Record est assez simple. Vous pouvez use Active Record anywhere, donc tout ce que vous avez à faire dans ce cas est de connecter Active Record à une base de données (par exemple une base de données sqlite en mémoire) et tester votre 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 

Cela devient plus difficile lorsque vous voulez tester les actions du contrôleur et autres. My live validations plugin a une suite de tests assez complète qui se moque de beaucoup de choses et me permet de passer les vues ERB comme une chaîne, vous pouvez jeter un oeil à cela.

Adapter ces exemples de Test :: Unit à RSpec devrait être trivial, car ils ne se greffent sur rien dans Test :: Unit.

+0

C'était très utile; Merci! Existe-t-il un moyen de conserver ActiveRecord chargé (ala spec_server ou spork) afin que le chargement d'ActiveRecord et la création de la base de données à chaque fois ne ralentissent pas tellement mes tests? – Chinasaur

+0

Je suis sûr qu'il y a un moyen de le faire. Si vous utilisez le stockage de fichiers sqlite3, au lieu de stockage de mémoire comme mes plugins validations en direct utilise, vous pouvez vérifier si le fichier de base de données .sqlite3 existe et ne pas exécuter les migrations si c'est le cas. –

+0

Cela a très bien fonctionné pour moi, juste quelques notes: 1) J'ai dû ajouter mon framework de test (rspec) et sqlite3 en tant que dépendances de développement dans mon gemspec (et bien sûr les rails en tant que dépendance d'exécution), 2) Nécessité d'exiger 'rails' & 'active_record' dans mon assistant de test bien –

Questions connexes