¿En qué se diferencia spec / rails_helper.rb de spec / spec_helper.rb? Lo necesito?

89

Estoy haciendo el tutorial de Rails por segunda vez. Cuando entro en esto

rails generate integration_test static_pages

Obtengo spec/rails_helper.rby en spec/spec_helper.rblugar de solospec/spec_helper.rb

Ahora, cuando ejecuto mis pruebas, son más largas (más "detalladas") y más lentas que cuando lo hice la última vez. Me pregunto cuál es la diferencia entre los dos archivos y si hice algo mal. Además, ¿hay alguna manera de deshacerse del rails_helper.rbarchivo sin estropearlo todo?

usuario3417583
fuente
¿Qué resultado producen sus pruebas que no produjeron antes? (Podría pertenecer a una nueva pregunta.)
Dave Schweisguth
No estoy seguro de la terminología, pero ahora las pruebas pasan por cada gema, lo que me da una larga lista de cosas que no entiendo, y solo entonces aparece el resultado. Antes, solo daba el resultado. Lo copiaría aquí, pero es muy largo ...
user3417583
Probablemente sean las depreciaciones de RSpec 3. Si no puede resolverlos con la búsqueda o con myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3 , colóquelos en una nueva pregunta.
Dave Schweisguth
1
está arreglado, tuve que eliminar --warnings de .rspec
user3417583

Respuestas:

128

rspec-rails 3 genera spec_helper.rby rails_helper.rb. spec_helper.rbes para especificaciones que no dependen de Rails (como especificaciones para clases en el directorio lib). rails_helper.rbes para especificaciones que dependen de Rails (en un proyecto de Rails, la mayoría o todas). rails_helper.rbrequiere spec_helper.rb. Así que no, no te deshagas de rails_helper.rb; lo requiera (y no spec_helper.rb) en sus especificaciones.

Si desea que sus especificaciones no dependientes de Rails hagan cumplir que no dependen de Rails y que se ejecuten lo más rápido posible cuando las ejecute por sí mismas, podría requerir en spec_helper.rblugar de rails_helper.rbesas. Pero es muy conveniente -r rails_helperen su .rspeclugar en lugar de requerir un ayudante u otro en cada archivo de especificaciones, por lo que seguramente será un enfoque popular.

Si está utilizando el precargador de resorte, cada clase solo debe cargarse una vez, y el resorte carga las clases con entusiasmo incluso si solo ejecuta una única especificación que lo requierespec_helper , por lo que no es tan valioso requerir solo spec_helperen algunos archivos.

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

Dave Schweisguth
fuente
4
Esto es muy confuso. Voy a agregar un PR para actualizar el archivo léame de rspec-rails para deletrearlo como lo ha hecho aquí. Gracias por la explicación.
steve
4
Para las personas que comienzan con rspec, ¡eso es un gran lío!
Eduardo
1

Siempre puede combinar todas sus configuraciones en spec_helper y solo requiere el ayudante de especificaciones en el archivo de ayuda de rieles.

De ninguna manera es "ideal" ya que al final del día, estás haciendo manualmente este "refactor" pero SI realmente te molesta. solo sé que depende totalmente de ti cómo estructurar elRspec.configure

#rails_helper.rb

require 'spec_helper'

#EMPTY FILE

y solo trae todas las configuraciones específicas de rieles en

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