Wie unterscheidet sich spec / rails_helper.rb von spec / spec_helper.rb? Brauche ich es


88

Ich mache das Rails Tutorial zum zweiten Mal. Wenn ich das eingebe

rails generate integration_test static_pages

Ich bekomme spec/rails_helper.rbund spec/spec_helper.rbstatt nurspec/spec_helper.rb

Wenn ich jetzt meine Tests durchführe, sind sie länger ("ausführlicher") und langsamer als beim letzten Mal. Ich frage mich, was der Unterschied zwischen den beiden Dateien ist und ob ich etwas falsch gemacht habe. Gibt es auch eine Möglichkeit, die rails_helper.rbDatei zu entfernen, ohne alles durcheinander zu bringen?


Welche Ausgabe haben Ihre Testprodukte, die sie vorher nicht produziert haben? (Könnte in eine neue Frage gehören.)
Dave Schweisguth

Ich bin mir über die Terminologie nicht sicher, aber jetzt gehen die Tests durch jedes Juwel, was mir eine lange Liste von Dingen gibt, die ich nicht verstehe, und erst dann erscheint das Ergebnis. Vorher gab es nur das Ergebnis. Ich würde es hier kopieren, aber es ist wirklich lang ...
user3417583

Es sind wahrscheinlich RSpec 3-Abwertungen. Wenn Sie sie nicht aus der Suche oder aus diesem myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3 herausfinden können , stellen Sie sie in eine neue Frage.
Dave Schweisguth

1
Es ist behoben, ich musste --warnings von .rspec
user3417583

Antworten:


126

rspec-schienen 3 erzeugt spec_helper.rbund rails_helper.rb. spec_helper.rbist für Spezifikationen, die nicht von Rails abhängen (z. B. Spezifikationen für Klassen im lib-Verzeichnis). rails_helper.rbist für Spezifikationen, die von Rails abhängen (in einem Rails-Projekt die meisten oder alle). rails_helper.rberfordert spec_helper.rb. Also nein, nicht loswerden rails_helper.rb; erfordern es (und nicht spec_helper.rb) in Ihren Spezifikationen.

Wenn Sie möchten, dass Ihre nicht Rails-abhängigen Spezifikationen erzwingen, dass sie nicht Rails-abhängig sind, und so schnell wie möglich ausgeführt werden, wenn Sie sie selbst ausführen, können Sie dies spec_helper.rbeher als rails_helper.rbin diesen benötigen . Aber es ist sehr praktisch, -r rails_helperin Ihrer .rspecSpezifikation nicht den einen oder anderen Helfer in jeder Spezifikationsdatei zu benötigen, so dass dies sicher ein beliebter Ansatz ist.

Wenn Sie den Spring Preloader verwenden, muss jede Klasse nur einmal geladen werden, und Spring lädt Klassen eifrig, selbst wenn Sie nur eine einzige Spezifikation ausführen, die dies erfordertspec_helper . Daher ist es nicht so wertvoll, nur spec_helperin einigen Dateien zu verlangen .

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


4
Das ist sehr verwirrend. Ich werde eine PR hinzufügen, um die Readme von rspec-Rails zu aktualisieren und sie so zu formulieren, wie Sie es hier getan haben. Danke für die Erklärung.
Steve

4
Für Leute, die mit rspec anfangen, ist das ein großes Durcheinander!
Eduardo

1

Sie können jederzeit alle Ihre Konfigurationen in spec_helper kombinieren und benötigen nur den spec helper in der Rails-Helper-Datei.

Es ist keineswegs "ideal", da Sie am Ende des Tages diesen "Refactor" manuell durchführen, aber WENN es Sie wirklich stört. Ich weiß nur, dass es ganz bei Ihnen liegt, wie Sie das strukturierenRspec.configure

#rails_helper.rb

require 'spec_helper'

#EMPTY FILE

und bringen Sie einfach alle Schienen-spezifischen Einstellungen ein

# 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.