Chargement automatique de la graine de données de db/graines.rb avec le râteau
Je suis en utilisant rails-rspec
gem et j'ai plusieurs spécifications (modèles, contrôleurs, etc). Quand je lance:
bundle exec rake
tout est testé. Cependant, je voudrais améliorer mes specs par semis de certaines données (db/graines.rb) juste après la base de données est créée (dans l'environnement de test).
Mon spec/spec_helper.rb.rb fichier ressemble à ceci:
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'capybara/rspec'
require 'ruby-debug'
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
config.mock_with :rspec
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
config.fixture_path = "#{::Rails.root}/spec/fixtures"
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = false
config.include SpecHelper
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
stub_xmpp_rest_client!
end
config.after(:each) do
DatabaseCleaner.clean
end
config.include Devise::TestHelpers, :type => :controller
config.include Delorean
config.after(:each) { back_to_the_present }
config.include Factory::Syntax::Methods
config.extend ControllerMacros, :type => :controller
end
Ce que pourrait faire le meilleur moyen de le faire? Merci.
Vous devez vous connecter pour publier un commentaire.
Selon la façon dont votre graine de fichier est configuré, vous pourriez être en mesure de charger/exécuter à partir d'une
before(:each)
oubefore(:all)
bloc:Mauvaise idée! Jamais, jamais, graines de votre base de données de test. Utiliser des usines à créer, au sein de chaque test, seulement les documents nécessaires pour que le test à passer. L'amorçage de la base de données de test permettra de faire vos tests de moins en moins fiable, car vous aurez à faire beaucoup d'hypothèses qui ne sont pas explicitement mentionné dans vos tests.
association :widget_type
). Alors vous n'avez pas besoin de semences de données: il vous suffit de faireFactory :widget
dans le test lui-même, et qu'il invoqueraFactory :widget_type
et ainsi de suite derrière les coulisses. Simple. Pas de graines nécessaire. Je le fais tout le temps.Factory :party
tant que de besoin. C'est plus de l'intention de révéler et explicite que vos graines. 'Vous n'êtes pas vraiment arriver "c'est un affreux tas de code qui a besoin de reconcevoir" très bien encore'—je l'obtenir. Ce n'est pas la question. 🙂Factory :party { group }
,Factory :group { group_type; country }
,Factory :country { continent; iso_code 'XX' }
et ainsi de suite.J'ai mis en place mon
rake spec
tâche pour charger automatiquement db/graines.rb, donc je dépend que de la configuration de la base de données pour un premier run. Ajoutez ceci à votre Rakefile:Puis, sur d'autres pistes je viens de l'appeler
rspec spec
directement pour sauter à la graine de l'étape et éviter le rechargement. J'ai configurer la base de données nettoyant pour ignorer la graine tables comme ceci:Pour les scénarios qui ont besoin de données validées, je peux ajouter:
Ce sera tronquée, de tout ce qui est après l'exemple fonctionne, sauf les graines de tables. Il est supposé que vous n'avez jamais écrire quoi que ce soit à la graine tables! Cela est généralement une hypothèse sûre, depuis la graine de données est généralement statiques.
Pour tous les autres scénarios, je compte sur les transactions à l'annulation des enregistrements insérés. La base de données est retourné à l'état d'origine, avec les données de la graine tables intacte. Il est sûr d'écrire pour la postérité tables ici si vous en avez besoin.
Pour reconstruire la graine tables, il vous suffit de lancer
rake spec
de nouveau.Pour charger les graines dans rspec vous devez l'ajouter après la base de données nettoyage de la confg.avant(:suite) dans
spec_helper.rb
Dans Rails 4.2.0 et RSpec 3.x, c'est comment mon rails_helper.rb semble.
copie de la graine.rb fichier dans le fichier config/initializers dossier.Ainsi la graine.rb fichier sera exécuté sur le serveur de démarrage.
Exécutez la commande ci-dessous pour remplir le test de db avec la semence.rb données
RAILS_ENV=test rake db:graine
Je pense que nous devrions utiliser
comme avant(:all) exécute le bloc une fois tous les exemples sont exécutés.
Donc, si nous utilisons
before :all
, la graine de données seront effacées.