Como spec / rails_helper.rb é diferente de spec / spec_helper.rb? Eu preciso disso?

88

Estou fazendo o Tutorial do Rails pela segunda vez. Quando eu entro neste

rails generate integration_test static_pages

Eu recebo spec/rails_helper.rbe em spec/spec_helper.rbvez de apenasspec/spec_helper.rb

Agora, quando eu executo meus testes, eles são mais longos (mais "verbosos") e mais lentos do que da última vez. Estou me perguntando qual é a diferença entre os dois arquivos e se fiz algo errado. Além disso, existe uma maneira de se livrar do rails_helper.rbarquivo sem bagunçar tudo?

user3417583
fonte
Que saída seus testes produzem que eles não produziram antes? (Pode pertencer a uma nova pergunta.)
Dave Schweisguth
Não tenho certeza sobre a terminologia, mas agora os testes passam por cada gema, o que me dá uma longa lista de coisas que não entendo, e só então o resultado aparece. Antes, só dava o resultado. Gostaria de copiá-lo aqui, mas é muito longo ...
user3417583
Provavelmente são depreciações do RSpec 3. Se você não consegue descobri-los na pesquisa ou neste myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3 , coloque-os em uma nova pergunta.
Dave Schweisguth
1
foi corrigido, tive que remover --warnings de .rspec
user3417583

Respostas:

127

rspec-rails 3 gera spec_helper.rbe rails_helper.rb. spec_helper.rbé para especificações que não dependem do Rails (como especificações para classes no diretório lib). rails_helper.rbé para especificações que dependem do Rails (em um projeto Rails, a maioria ou todos eles). rails_helper.rbrequer spec_helper.rb. Portanto, não, não se livre rails_helper.rb; exigem (e não spec_helper.rb) em suas especificações.

Se você deseja que suas especificações não dependentes de Rails garantam que elas não são dependentes de Rails e executem o mais rápido possível quando você as executa por si mesmas, você pode exigir spec_helper.rbao invés rails_helper.rbde nelas. Mas é muito conveniente para você, -r rails_helperem .rspecvez de exigir um auxiliar ou outro em cada arquivo de especificação, de modo que com certeza é uma abordagem popular.

Se você estiver usando o spring preloader, cada classe só precisa ser carregada uma vez, e a spring carrega as classes avidamente, mesmo se você executar apenas uma única especificação que exigespec_helper , portanto, não há tanto valor em exigir apenas spec_helperem alguns arquivos.

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

Dave Schweisguth
fonte
4
Isso é muito confuso. Vou adicionar um PR para atualizar o leia-me rspec-rails para explicá-lo como você fez aqui. Obrigada pelo esclarecimento.
steve de
4
Para quem está começando no rspec, isso é uma grande bagunça!
Eduardo
1

Você sempre pode combinar todas as suas configurações no spec_helper e apenas requerer o spec helper no arquivo do helper do Rails.

Não é de forma alguma "ideal", já que no final do dia, você está fazendo esse "refatorar" manualmente, mas SE isso realmente o incomodar. apenas saiba que depende totalmente de você como estruturar oRspec.configure

#rails_helper.rb

require 'spec_helper'

#EMPTY FILE

e apenas trazer todas as configurações específicas dos trilhos

# 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
fonte