Czym różni się spec / rails_helper.rb od spec / spec_helper.rb? Czy tego potrzebuję?

89

Po raz drugi robię samouczek dotyczący Railsów. Kiedy w to wchodzę

rails generate integration_test static_pages

Dostaję spec/rails_helper.rbi spec/spec_helper.rbzamiast po prostuspec/spec_helper.rb

Teraz, kiedy przeprowadzam testy, są one dłuższe (bardziej „szczegółowe”) i wolniejsze niż wtedy, gdy robiłem to ostatnim razem. Zastanawiam się, jaka jest różnica między tymi dwoma plikami i czy zrobiłem coś źle. Czy istnieje sposób na pozbycie się rails_helper.rbpliku bez zepsucia wszystkiego?

user3417583
źródło
Jakiego wyniku testujesz produkt, którego wcześniej nie wyprodukowali? (Może należeć do nowego pytania.)
Dave Schweisguth
Nie jestem pewien terminologii, ale teraz testy przechodzą przez każdy klejnot, co daje mi długą listę rzeczy, których nie rozumiem, i dopiero wtedy pojawia się wynik. Wcześniej po prostu dał wynik. Skopiowałbym to tutaj, ale jest naprawdę długi ...
user3417583
Prawdopodobnie jest to wycofanie RSpec 3. Jeśli nie możesz ich znaleźć na podstawie wyszukiwania lub z tego myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3 , zadaj im nowe pytanie.
Dave Schweisguth
1
to naprawione, musiałem usunąć --warnings z .rspec
user3417583

Odpowiedzi:

128

rspec-rails 3 generuje spec_helper.rbi rails_helper.rb. spec_helper.rbdotyczy specyfikacji, które nie zależą od Railsów (takich jak specyfikacje klas w katalogu lib). rails_helper.rbdotyczy specyfikacji, które zależą od Railsów (w projekcie Railsowym, większość lub wszystkie). rails_helper.rbwymaga spec_helper.rb. Więc nie, nie pozbywaj się rails_helper.rb; wymagaj tego (a nie spec_helper.rb) w swoich specyfikacjach.

Jeśli chcesz, aby specyfikacje niezależne od Railsów wymuszały, że nie są zależne od Railsów, i aby działały tak szybko, jak to możliwe, gdy uruchamiasz je samodzielnie, możesz wymagać spec_helper.rbraczej niż rails_helper.rbw tych. Ale jest to bardzo wygodne, aby -r rails_helperw swojej .rspeczamiast wymagające jednego pomocnika lub inny w każdym pliku spec, więc z pewnością będzie popularnym podejściem.

Jeśli używasz modułu wstępnego ładowania sprężyny, każda klasa musi zostać załadowana tylko raz, a sprężyna chętniespec_helper obciąża klasy, nawet jeśli używasz tylko jednej specyfikacji, która wymaga , więc nie ma takiej wartości w wymaganiu tylko spec_helperw niektórych plikach.

Źródło: https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#default-helper-files

Dave Schweisguth
źródło
4
To bardzo zagmatwane. Dodam PR, aby zaktualizować plik readme rspec-rails, aby przeliterować to, co masz tutaj. Dziękuję za wyjaśnienie.
steve
4
Dla osób zaczynających od rspec to wielki bałagan!
Eduardo
1

Zawsze możesz połączyć wszystkie swoje konfiguracje w spec_helper i wymagać tylko tego helpera w pliku pomocniczym rails.

Nie jest to bynajmniej „idealne”, ponieważ na koniec dnia robisz ten „refaktor” ręcznie, ale JEŚLI naprawdę ci to przeszkadza. po prostu wiedz, że to całkowicie zależy od Ciebie, jak uporządkować plikRspec.configure

#rails_helper.rb

require 'spec_helper'

#EMPTY FILE

i po prostu wprowadź wszystkie specyficzne ustawienia dla szyn

# 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
źródło