Warum arbeitet factory_girl nicht für mich? - Zeilen bleiben nach tests @ in der Datenba

Ich versuche, factory_girl zu verwenden, um eine "Benutzer" -Factory (mit RSpec) zu erstellen. Diese scheint jedoch nicht transaktionell zu funktionieren und schlägt anscheinend aufgrund der verbleibenden Daten aus früheren Tests in der Testdatenbank fehl.

Factory.define :user do |user|
  user.name                   "Joe Blow"
  user.email                  "[email protected]" 
  user.password               'password'
  user.password_confirmation  'password'
end

@user = Factory.create(:user)

Das Ausführen der ersten Testreihe ist in Ordnung:

spec spec/ 


...
Finished in 2.758806 seconds

60 examples, 0 failures, 11 pending

Alles gut und wie erwartet, aber die Tests erneut ausführen:

spec spec/ 
...
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/validations.rb:1102:in `save_without_dirty!': Validation failed: Email has already been taken (ActiveRecord::RecordInvalid)
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/dirty.rb:87:in `save_without_transactions!'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/transactions.rb:200:in `save!'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/transactions.rb:182:in `transaction'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/transactions.rb:200:in `save!'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/transactions.rb:208:in `rollback_active_record_state!'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/transactions.rb:200:in `save!'
    from /Library/Ruby/Gems/1.8/gems/factory_girl-1.2.3/lib/factory_girl/proxy/create.rb:6:in `result'
    from /Library/Ruby/Gems/1.8/gems/factory_girl-1.2.3/lib/factory_girl/factory.rb:316:in `run'
    from /Library/Ruby/Gems/1.8/gems/factory_girl-1.2.3/lib/factory_girl/factory.rb:260:in `create'
    from /Users/petenixey/Rails_apps/resample/spec/controllers/users_controller_spec.rb:7
    from /Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:183:in `module_eval'
    from /Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:183:in `subclass'
    from /Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:55:in `describe'
    from /Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_factory.rb:31:in `create_example_group'
    from /Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/dsl/main.rb:28:in `describe'
    from /Users/petenixey/Rails_apps/resample/spec/controllers/users_controller_spec.rb:3
    from /Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:147:in `load_without_new_constant_marking'
    from /Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:147:in `load'
    from /Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:15:in `load_files'
    from /Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:14:in `each'
    from /Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:14:in `load_files'
    from /Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/options.rb:133:in `run_examples'
    from /Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/command_line.rb:9:in `run'
    from /Library/Ruby/Gems/1.8/gems/rspec-1.3.0/bin/spec:5
    from /usr/bin/spec:19:in `load'
    from /usr/bin/spec:19

Fix Versuch - benutze Factory.sequence

Da ich in meinem E-Mail-Feld eine Einschränkung bezüglich der Eindeutigkeit habe, habe ich versucht, das Problem mithilfe der Sequenzmethode von factory_girl zu beheben:

Factory.define :user do |user|
  user.name                   "Joe Blow"
  user.sequence(:email) {|n| "joe#{n}@blow.com" }
  user.password               'password'
  user.password_confirmation  'password'
end

Ich lief dann

rake db:test:prepare
spec spec/
.. # running the tests once executes fine
spec spec/
.. # running them the second time produces the same set of errors as before

Benutzer scheinen in der Datenbank zu bleiben

Wenn ich mir die Datenbank /db/test.sqlite3 anschaue, scheint es, dass die Zeile für den Testbenutzer zwischen den Tests nicht aus der Datenbank zurückgesetzt wird. Ich dachte, dass diese Tests transaktional sein sollten, aber sie scheinen für mich nicht so zu sein.

Dies würde erklären, warum der Test beim ersten Mal korrekt ausgeführt wird (und wenn ich die Datenbank lösche), beim zweiten Mal jedoch fehlschlägt.

Kann jemand erklären, was ich ändern sollte, um sicherzustellen, dass die Tests transaktional ausgeführt werden?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage