Die Schienen Test db bestehen keine Aufzeichnung Änderungen
-
23-09-2019 - |
Frage
Ich habe versucht jetzt ein Problem für ein paar Wochen zu lösen. Ich betreibe rspec Tests für meine Rails-Anwendung, und sie arbeiten gut bis auf einen Fehler, dass ich nicht um meinen Kopf zu bekommen scheinen.
- Ich verwende MySQL mit der InnoDB-Engine.
- Ich habe eingestellt
config.use_transactional_fixtures = true
in spec_helper.rb - Ich meine Prüfvorrichtungen laden manuell mit dem Befehl
rake spec:db:fixtures:load
. - Der rspec Test für einen BackgrounDRb Arbeiter geschrieben wird, und es wird getestet, dass ein Datensatz seinen Zustand (durch die state_machine gem) aktualisiert haben kann.
Hier ist mein Problem:
habe ich ein Modell namens Listings
. Der rspec Test ruft die update_sold_items
Methode innerhalb einer Datei namens listing_worker.rb
.
Diese Methode ruft listing.sell
für einen bestimmten Datensatz, der die Auflistung Rekord Spalte ‚Status‘ auf ‚verkauft‘ setzt.
Bisher ist das alles funktioniert gut, aber wenn die update_sold_items
Verfahren beendet, mein rspec Test nicht besteht hier:
listing = Listing.find_by_listing_id(listing_id)
listing.state.should == "sold"
expected: "sold",
got: "current" (using ==)
Ich habe versucht, auf die Spur, warum die Zustandsänderung nicht hält an, aber ich bin ziemlich verloren. Hier ist das Ergebnis eines Debug-Code, dass ich in dem update_sold_items
Verfahren während des Tests gelegt:
pp listing.state # => "current"
listing.sell!
listing.save!
pp listing.state # => "sold"
listing.reload
pp listing.state # => "current"
Ich kann nicht verstehen, warum es völlig in Ordnung, spart, aber dann kehrt zurück auf den ursprünglichen Datensatz, wenn ich reload
nennen, oder Listing.find
etc.
Vielen Dank für die Lektüre dieses, und bitte keine Fragen stellen, wenn ich nicht genügend Informationen gegeben haben.
Danke für Ihre Hilfe, Nathan B
P. S. Ich habe kein Problem neue Datensätze für andere Klassen zu schaffen, und die Datensätze zu testen. Es scheint nur ein Problem zu sein, wenn ich Aufzeichnungen bin Aktualisierung, die bereits in der Datenbank vorhanden sein.
Lösung
Ich vermute, wie Nathans, Transaktionsfragen. Versuchen Sie, eine Listing.connection.execute ( „COMMIT“) direkt vor dem ersten Speicher Anruf setzte die Transaktion zu brechen und sehen, was ändert. Das werden Sie bricht der Transaktion, so zusätzliche Rollback-Anrufe werden nicht wirksam.
Zusätzlich wird durch einen „COMMIT“ Befehl ausgeführt wird, können Sie den Test mit einem Debugger anhalten und überprüfen Sie die Datenbank von einem anderen Client, um zu sehen, was los ist.
Die andere Hypothese, wenn die Transaktion Experimentieren keine Ergebnisse nicht nachgibt, ist das vielleicht wirklich Ihr Modell nicht auf die Datenbank zu speichern. Überprüfen Sie Ihre Abfrage-Logs. (Insbesondere die Update-Abfrage finden).
stinkt Diese Art von Fragen wirklich! Viel Glück!
Andere Tipps
Wenn Sie möchten, zu untersuchen, was man in der DB haben während des Tests laufen Sie könnte dies hilfreich ...
findenIch habe einen rspec Test, wo ich speichern @ user.save und es wirkt wie ein Zauber, aber dann wollte ich sehen, ob es wirklich in der DB gespeichert wird.
Ich öffnete Schienen Konsole für Testumgebung
rails c test
ran
User.all
und wie erwartet hat nichts
lief ich meine spec das enthält:
user_attr_hash = FactoryGirl.attributes_for(:user)
@user = User.new user_attr_hash
@user.save
binding.pry
Ich dachte, dass der Test zu stoppen, nachdem speichern würde bedeuten, dass es beibehalten, aber das ist nicht der Fall. Es scheint, dass COMMIT auf die Verbindung später gebrannt wird (ich habe keine Ahnung, wann: \) So, wie @ Tim Harper schon sagt, haben Sie Feuer, das sich in der hebeln Konsole begehen:
pry(#<RSpec::Core::ExampleGroup::Nested_1>)> User.connection.execute("COMMIT")
Wenn Sie nun User.all in Ihren Schienen laufen trösten Sie es sehen sollten;)