Чем spec / rails_helper.rb отличается от spec / spec_helper.rb? Оно мне нужно?

89

Я уже второй раз занимаюсь Rails Tutorial. Когда я вхожу в это

rails generate integration_test static_pages

Я получаю spec/rails_helper.rbи spec/spec_helper.rbвместо простоspec/spec_helper.rb

Теперь, когда я запускаю свои тесты, они длиннее (более «подробны») и медленнее, чем когда я делал это в прошлый раз. Мне интересно, в чем разница между двумя файлами, и сделал ли я что-то не так. Кроме того, есть ли способ избавиться от rails_helper.rbфайла, не испортив все проблемы?

пользователь3417583
источник
Какую продукцию вы тестируете, чего раньше не выпускали? (Может быть, в новом вопросе.)
Дэйв Швайсгут
Я не уверен насчет терминологии, но теперь тесты проходят через каждый драгоценный камень, что дает мне длинный список вещей, которые я не понимаю, и только тогда появляется результат. Раньше это просто давало результат. Я бы скопировал его сюда, но он очень длинный ...
user3417583
Вероятно, это устаревшая версия RSpec 3. Если вы не можете выяснить их с помощью поиска или из этого myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3 , задайте новый вопрос.
Dave Schweisguth
1
это исправлено, мне пришлось удалить --warnings из .rspec
user3417583

Ответы:

128

rspec-rails 3 генерирует spec_helper.rbи rails_helper.rb. spec_helper.rbпредназначен для спецификаций, которые не зависят от Rails (например, для спецификаций классов в каталоге lib). rails_helper.rbпредназначен для спецификаций, которые зависят от Rails (в проекте Rails, большинство или все из них). rails_helper.rbтребует spec_helper.rb. Так что нет, не избавляйтесь от rails_helper.rb; требуется (а не spec_helper.rb) в ваших спецификациях.

Если вы хотите, чтобы ваши спецификации, не зависящие от Rails, обеспечивали независимость от Rails, и чтобы они работали как можно быстрее, когда вы запускаете их сами по себе, вы можете потребовать, spec_helper.rbа не rails_helper.rbв них. Но это очень удобно -r rails_helperв вашем , .rspecа не требовать одного помощника или другой в каждом файле спецификации, так что обязательно будет популярным подходом.

Если вы используете предварительный загрузчик spring, каждый класс нужно загружать только один раз, а Spring загружает классы с нетерпением, даже если вы запускаете только одну спецификацию, которая требуетspec_helper , поэтому не так много смысла требовать только spec_helperв некоторых файлах.

Источник: https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#default-helper-files

Дэйв Швайсгут
источник
4
Это очень сбивает с толку. Я собираюсь добавить PR к обновлению rspec-rails readme, чтобы изложить это, как вы здесь. Спасибо за объяснение.
Стив
4
Для людей, начинающих с rspec, это большой беспорядок!
Эдуардо
1

Вы всегда можете объединить все свои конфиги в spec_helper и потребовать только вспомогательного специалиста в файле rails helper.

Это ни в коем случае не «идеально», поскольку в конце концов вы вручную выполняете этот «рефакторинг», но ЕСЛИ это действительно вас беспокоит. просто знайте, что это полностью зависит от вас, как структурироватьRspec.configure

#rails_helper.rb

require 'spec_helper'

#EMPTY FILE

и просто введите все настройки рельсов в

# 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
Денис С. Дуйота
источник