2011-01-05 5 views
0

Aufgrund einer alten Datenbank, die ich verwende, stehe ich mit MySQL fest und verwende MyISAM, was bedeutet, dass meine Tabellen keine Transaktionen unterstützen. Dies führt dazu, dass die Tests fehlschlagen, da die von den Tests generierten Tabellendaten (ich verwende factory_girl für Fixtures) nicht für jedes Szenario zurückgesetzt werden.Deaktivieren von transaktionalen Fixtures in Rspec hat keine Auswirkungen

Ich entdeckte, dass Rspec die Konfigurationseinstellung config.use_transactional_fixtures in spec_helper.rb verfügbar macht.

, die standardmäßig auf true gesetzt ist. Wenn ich es auf false setze, sehe ich keinen Effekt auf meine Tests; Sie schlagen immer noch aufgrund von doppelten Datensätzen fehl.

Soll diese Einstellung nicht automatisch alle an der DB vorgenommenen Änderungen aufheben? Oder soll ich das manuell machen?

Antwort

1

Sie sind richtig - wenn Ihre Datenbank keine Transaktionen unterstützen, müssen Sie ausgeben mehrere SQL-Befehle Daten auszulöschen vor jeder Aussage:

TRUNCATE TABLE tablename; 

Eine für jede Ihrer Tabellen.

In Ihrem helper.rb versuchen Sie dies:

Spec::Runner.configure do |config| 
    config.before(:each) do 
    tables = %{users posts tags} 
    tables.each do |t| 
     ActiveRecord::Base.connection.execute('TRUNCATE TABLE #{t}') 
    end 
    end 
    ... 
end 
+0

Cool, danke; Ich hatte den Eindruck, dass Rails das irgendwie automatisiert. –