En quoi spec / rails_helper.rb est-il différent de spec / spec_helper.rb? En ai-je besoin?

88

Je fais le didacticiel Rails pour la deuxième fois. Quand j'entre dans ça

rails generate integration_test static_pages

Je reçois spec/rails_helper.rbet spec/spec_helper.rbau lieu de justespec/spec_helper.rb

Maintenant, quand j'exécute mes tests, ils sont plus longs (plus "verbeux") et plus lents que lorsque je l'ai fait la dernière fois. Je me demande quelle est la différence entre les deux fichiers et si j'ai fait quelque chose de mal. En outre, existe-t-il un moyen de se débarrasser du rails_helper.rbfichier sans tout gâcher?

user3417583
la source
Quel résultat vos tests produisent-ils qu'ils ne produisaient pas auparavant? (Cela pourrait appartenir à une nouvelle question.)
Dave Schweisguth
Je ne suis pas sûr de la terminologie, mais maintenant les tests passent par chaque gemme, ce qui me donne une longue liste de choses que je ne comprends pas, et ce n'est qu'alors que le résultat apparaît. Avant, ça donnait juste le résultat. Je le copierais ici mais c'est vraiment long ...
user3417583
Il s'agit probablement de dépréciations de RSpec 3. Si vous ne pouvez pas les comprendre à partir de la recherche ou de ce myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3 , posez-les dans une nouvelle question.
Dave Schweisguth
1
c'est corrigé, j'ai dû supprimer --warnings de .rspec
user3417583

Réponses:

127

rspec-rails 3 génère spec_helper.rbet rails_helper.rb. spec_helper.rbest pour les spécifications qui ne dépendent pas de Rails (telles que les spécifications pour les classes dans le répertoire lib). rails_helper.rbest pour les spécifications qui dépendent de Rails (dans un projet Rails, la plupart ou la totalité d'entre eux). rails_helper.rbexige spec_helper.rb. Alors non, ne vous en débarrassez pas rails_helper.rb; l'exigent (et non spec_helper.rb) dans vos spécifications.

Si vous voulez que vos spécifications non dépendantes de Rails vous imposent qu'elles ne dépendent pas de Rails et qu'elles s'exécutent aussi vite que possible lorsque vous les exécutez elles-mêmes, vous pouvez exiger spec_helper.rbplutôt que rails_helper.rbcelles-ci. Mais c'est très pratique -r rails_helperdans votre .rspecplutôt que d'exiger un assistant ou l'autre dans chaque fichier de spécification, c'est donc une approche populaire.

Si vous utilisez le préchargement de ressort, chaque classe n'a besoin d'être chargée qu'une seule fois, et spring charge les classes avec empressement, même si vous n'exécutez qu'une seule spécification qui l'exigespec_helper , il n'y a donc pas autant de valeur à exiger que spec_helperdans certains fichiers.

Source: https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#default-helper-files

Dave Schweisguth
la source
4
C'est très déroutant. Je vais ajouter un PR pour mettre à jour le fichier readme de rspec-rails pour le préciser comme vous l'avez ici. Merci pour l'explication.
steve
4
Pour les gens qui commencent sur rspec, c'est un gros gâchis!
Eduardo
1

Vous pouvez toujours combiner toutes vos configurations dans le spec_helper et ne nécessiter que le spec helper dans le fichier d'aide rails.

Ce n'est en aucun cas "idéal" puisque à la fin de la journée, vous faites manuellement ce "refactor" mais SI cela vous dérange vraiment. sachez que c'est à vous de décider comment structurer leRspec.configure

#rails_helper.rb

require 'spec_helper'

#EMPTY FILE

et apportez simplement toutes les configurations spécifiques aux rails

# spec_helper.rb

# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'

require File.expand_path('../config/environment', __dir__)

# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
# Add additional requires below this line. Rails is not loaded until this point!

# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
# run as spec files by default. This means that files in spec/support that end
# in _spec.rb will both be required and run as specs, causing the specs to be
# run twice. It is recommended that you do not name files matching this glob to
# end with _spec.rb. You can configure this pattern with the --pattern
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
#
# The following line is provided for convenience purposes. It has the downside
# of increasing the boot-up time by auto-requiring all files in the support
# directory. Alternatively, in the individual `*_spec.rb` files, manually
# require only the support files necessary.
#
# Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }

# Checks for pending migrations and applies them before tests are run.
# If you are not using ActiveRecord, you can remove these lines.
begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end
RSpec.configure do |config|

... all our config.whatever_your_heart_desires
Denis S Dujota
la source