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.

War es hilfreich?

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 ...

finden

Ich 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;)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top