contest_entry_spec.rb
require 'spec_helper'
describe ContestEntry do
before(:all) do
@admission=Factory(:project_admission)
@project=Factory(:project_started, :project_type => @admission.project_type)
@creative=Factory(:approved_creative, :creative_category => @admission.creative_category)
@contest_entry=Factory(:contest_entry, :design_file_name => 'bla bla bla', :owner => @creative, :project => @project)
end
context 'non-specific tests' do
subject { @contest_entry }
it { should belong_to(:owner).class_name('User') }
it { should belong_to(:project) }
it { should have_many(:entry_comments) }
it { should validate_presence_of(:owner) }
it { should validate_presence_of(:project) }
it { should validate_presence_of(:entry_no) }
it { should validate_presence_of(:title) }
end
end
Wenn ich diese Tests durchführe, ist alles in Ordnung, aber wenn ich vor (: all) zu vor (: each) ändere, schlägt jeder Test fehl. Ich weiß nicht, warum es passiert?
Dies ist der Fehler
Failure/Error: @contest_entry=Factory(:contest_entry, :design_file_name => 'bla bla bla', :owner => @creative, :project => @project)
ActiveRecord::RecordInvalid:
Validation Failed: User is not allowed for this type of project
ruby-on-rails
rspec
Johnny Cash
quelle
quelle
Ein wichtiges Detail von
before :all
ist, dass es nicht DB isttransactional
. Das heißt, alles in derbefore :all
Datenbank bleibt bestehen, und Sie müssen dieafter :all
Methode manuell herunterfahren .Implikationen bedeuten, dass nach Abschluss der Testsuiten Änderungen nicht für spätere Tests zurückgesetzt werden. Dies kann zu komplizierten Fehlern und Problemen bei der Kreuzkontamination von Daten führen. Dh wenn eine Ausnahme ausgelöst wird, wird der
after :all
Rückruf nicht aufgerufen.Ist
before: each
jedoch DB-Transaktion.Ein schneller Test, um zu demonstrieren:
1. Schneiden Sie die entsprechende DB-Tabelle ab und versuchen Sie Folgendes:
before :all do @user = Fabricate(:user, name: 'Yolo') end
2. Beobachten Sie die Datenbank danach, das Modell bleibt bestehen !
after :all
ist nötig. Wenn in Ihrem Test jedoch eine Ausnahme auftritt, tritt dieser Rückruf nicht auf, da der Fluss unterbrochen wurde. Die Datenbank wird in einem unbekannten Zustand belassen, was insbesondere bei CI / CD-Umgebungen und automatisierten Tests problematisch sein kann.3. Jetzt versuchen Sie dies,
before :each do @user = Fabricate(:user, name: 'Yolo') end
4. Jetzt bleibt die Datenbank nach Abschluss der Testsuite ohne Daten . Weitaus besser und hinterlässt nach den Tests einen konsistenten Zustand.
Kurz gesagt,
before :each
ist wahrscheinlich das, was Sie wollen. Ihre Tests laufen etwas langsamer, aber die Kosten sind es wert.Details hier: https://relishapp.com/rspec/rspec-rails/docs/transactions Siehe:
Data created in before(:all) are not rolled back
Hoffe das hilft einem anderen müden Reisenden.
quelle
before(:all)
Dies stellt sicher, dass die Beispielbenutzer vor allen Tests im Block einmal erstellt werden. Dies ist eine Optimierung für die Geschwindigkeit.quelle
Eine Sache, die zu beachten ist, ist standardmäßig vor der Verwendung vor (: each), auch vor (: all) ist die Controller-Instanz nicht festgelegt, so dass die Controller-Methoden wie request nicht verwendet werden.
quelle