Чим spec / rails_helper.rb відрізняється від spec / spec_helper.rb? Мені це потрібно?


89

Я роблю підручник з Rails вдруге. Коли я вводжу це

rails generate integration_test static_pages

Отримую spec/rails_helper.rbі spec/spec_helper.rbзамість простоspec/spec_helper.rb

Тепер, коли я запускаю свої тести, вони довші (більш "детальні") і повільніші, ніж коли я робив це останній раз. Мені цікаво, в чому різниця між двома файлами, і якщо я зробив щось не так. Крім того, чи є спосіб позбутися rails_helper.rbфайлу, не зіпсувавши все?


Який результат отримує ваш тестовий продукт, якого вони раніше не виробляли? (Може належати до нового запитання.)
Дейв Швайсгут,

Я не впевнений у термінології, але зараз тести проходять кожну перлину, що дає мені довгий перелік того, що я не розумію, і лише тоді з’являється результат. Раніше це просто дало результат. Я б скопіював його тут, але це справді довго ...
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 і вимагати лише допоміжного файлу специфікації у файлі допоміжного файлу.

Це аж ніяк не "ідеально", оскільки наприкінці дня ви робите цей "рефактор" вручну, але ЯКЩО це вас справді турбує. просто знайте, що це повністю залежить від вас, як структурувати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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.