jollyroger
2010-Mar-15 12:24 UTC
[rspec-users] Insufficient database clean-up between specs
Hey guys, unfortunately I''ve got one more issue with rspec right now. It seems like rspec isnt properly cleaning up the database after each spec. I have the following spec: ################################################################### describe ProfilesController do describe "GET ''index''" do it ''should render active profiles'' do active_user = Factory(:user, :active => 1) active_user.profile = Factory.build(:profile) inactive_user = Factory(:user, :active => 0) inactive_user.profile = Factory.build(:profile) get ''index'' assigns[:profiles].should == [active_user.profile] end end # ...... end ################################################################### This spec fails with: ################################################################### ''ProfilesController GET ''index'' should render active profiles'' FAILED expected: [#<Profile id: 83, user_id: 80, real_name: "Wendy Moore", country: "Yemen, Rep.", icon_file_name: nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: nil, description: "I''ve gotten burned over Cheryl Tiegs and blown up f...", personal_website_url: "www.google.com", social_network_of_choice: nil, twitter_name: "Sarah", created_at: "2010-03-15 11:41:56", updated_at: "2010-03-15 11:41:56">], got: [#<Profile id: 83, user_id: 80, real_name: "Wendy Moore", country: "Yemen, Rep.", icon_file_name: nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: nil, description: "I''ve gotten burned over Cheryl Tiegs and blown up f...", personal_website_url: "www.google.com", social_network_of_choice: nil, twitter_name: "Sarah", created_at: "2010-03-15 11:41:56", updated_at: "2010-03-15 11:41:56">, #<Profile id: 37, user_id: 37, real_name: nil, country: nil, icon_file_name: nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: nil, description: nil, personal_website_url: nil, social_network_of_choice: nil, twitter_name: nil, created_at: "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">, #<Profile id: 40, user_id: 40, real_name: nil, country: nil, icon_file_name: nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: nil, description: nil, personal_website_url: nil, social_network_of_choice: nil, twitter_name: nil, created_at: "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">, #<Profile id: 52, user_id: 52, real_name: nil, country: nil, icon_file_name: nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: nil, description: nil, personal_website_url: nil, social_network_of_choice: nil, twitter_name: nil, created_at: "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">] (using ==) ################################################################### As you can see, the problem is that there are more profiles than actually expected. Running this exact spec alone is ok: ################################################################### spec spec/controllers/profiles_controller_spec.rb -l 17 . Finished in 7.743924 seconds 1 example, 0 failures ################################################################### The same goes for the whole spec-file itself: ################################################################### spec spec/controllers/profiles_controller_spec.rb ............ Finished in 6.108002 seconds 12 examples, 0 failures ################################################################### A quick debugging via: ################################################################### it ''should render active profiles'' do custom_log("Profile-count before: #{Profile.count.to_s}") # ........ see code from before get ''index'' custom_log("Profile-count after: #{Profile.count.to_s}") assigns[:profiles].should == [active_user.profile] end ################################################################### shows: ################################################################### Profile-count before: 3 Profile-count after: 5 ################################################################### Apparently the problem is, that there are still previously created profiles around. As far as I''ve understood rspec, shouldn''t the database be properly cleaned up after each spec? In other words, shouldn''t there be zero profiles before running the spec from above? Sys-Info: OS: Ubuntu 9.10 spec -v rspec 1.3.0 Mocking / Stubbing: Mocha 0.9.8
David Chelimsky
2010-Mar-15 12:34 UTC
[rspec-users] Insufficient database clean-up between specs
On Mon, Mar 15, 2010 at 7:24 AM, jollyroger <timo.roessner at googlemail.com> wrote:> Hey guys, > > unfortunately I''ve got one more issue with rspec right now. > > It seems like rspec isnt properly cleaning up the database after each > spec. > > I have the following spec: > > ################################################################### > describe ProfilesController do > ?describe "GET ''index''" do > ? ?it ''should render active profiles'' do > ? ? ?active_user = Factory(:user, :active => 1) > ? ? ?active_user.profile = Factory.build(:profile) > ? ? ?inactive_user = Factory(:user, :active => 0) > ? ? ?inactive_user.profile = Factory.build(:profile) > ? ? ?get ''index'' > ? ? ?assigns[:profiles].should == [active_user.profile] > ? ?end > ?end > ?# ...... > end > ################################################################### > > This spec fails with: > > ################################################################### > ''ProfilesController GET ''index'' should render active profiles'' FAILED > expected: [#<Profile id: 83, user_id: 80, real_name: "Wendy Moore", > country: "Yemen, Rep.", icon_file_name: nil, icon_content_type: nil, > icon_file_size: nil, icon_updated_at: nil, description: "I''ve gotten > burned over Cheryl Tiegs and blown up f...", personal_website_url: > "www.google.com", social_network_of_choice: nil, twitter_name: > "Sarah", created_at: "2010-03-15 11:41:56", updated_at: "2010-03-15 > 11:41:56">], > ? ? got: [#<Profile id: 83, user_id: 80, real_name: "Wendy Moore", > country: "Yemen, Rep.", icon_file_name: nil, icon_content_type: nil, > icon_file_size: nil, icon_updated_at: nil, description: "I''ve gotten > burned over Cheryl Tiegs and blown up f...", personal_website_url: > "www.google.com", social_network_of_choice: nil, twitter_name: > "Sarah", created_at: "2010-03-15 11:41:56", updated_at: "2010-03-15 > 11:41:56">, #<Profile id: 37, user_id: 37, real_name: nil, country: > nil, icon_file_name: nil, icon_content_type: nil, icon_file_size: nil, > icon_updated_at: nil, description: nil, personal_website_url: nil, > social_network_of_choice: nil, twitter_name: nil, created_at: > "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">, #<Profile > id: 40, user_id: 40, real_name: nil, country: nil, icon_file_name: > nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: > nil, description: nil, personal_website_url: nil, > social_network_of_choice: nil, twitter_name: nil, created_at: > "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">, #<Profile > id: 52, user_id: 52, real_name: nil, country: nil, icon_file_name: > nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: > nil, description: nil, personal_website_url: nil, > social_network_of_choice: nil, twitter_name: nil, created_at: > "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">] (using ==) > ################################################################### > > As you can see, the problem is that there are more profiles than > actually expected. > > Running this exact spec alone is ok: > > ################################################################### > spec spec/controllers/profiles_controller_spec.rb -l 17 > . > > Finished in 7.743924 seconds > > 1 example, 0 failures > ################################################################### > > The same goes for the whole spec-file itself: > > ################################################################### > spec spec/controllers/profiles_controller_spec.rb > ............ > > Finished in 6.108002 seconds > > 12 examples, 0 failures > ################################################################### > > A quick debugging via: > > ################################################################### > ? ?it ''should render active profiles'' do > ? ? ?custom_log("Profile-count before: #{Profile.count.to_s}") > ? ? ?# ........ see code from before > ? ? ?get ''index'' > ? ? ?custom_log("Profile-count after: #{Profile.count.to_s}") > ? ? ?assigns[:profiles].should == [active_user.profile] > ? ?end > ################################################################### > > shows: > > ################################################################### > Profile-count before: 3 > Profile-count after: 5 > ################################################################### > > Apparently the problem is, that there are still previously created > profiles around. > > As far as I''ve understood rspec, shouldn''t the database be properly > cleaned up after each spec? > In other words, shouldn''t there be zero profiles before running the > spec from above?rspec-rails hooks into rails'' transaction management, rolling back transactions after every example. It does not guarantee that your database is empty - just that it is in the same state after each example that it was in before. Now there are a couple of caveats here: 1 - you have to have "config.use_transactional_fixtures = true" in spec/spec_helper.rb This is rails'' nomenclature and really means "run each example in a transaction" 2 - if you use before(:all) anywhere in your suite, that code is _not_ run in a transaction and it is up to you to destroy any data you create. HTH, David> Sys-Info: > OS: Ubuntu 9.10 > spec -v > rspec 1.3.0 > Mocking / Stubbing: Mocha 0.9.8
Matt Wynne
2010-Mar-16 10:10 UTC
[rspec-users] Insufficient database clean-up between specs
On 15 Mar 2010, at 12:34, David Chelimsky wrote:> On Mon, Mar 15, 2010 at 7:24 AM, jollyroger > <timo.roessner at googlemail.com> wrote: >> Hey guys, >> >> unfortunately I''ve got one more issue with rspec right now. >> >> It seems like rspec isnt properly cleaning up the database after each >> spec. >> >> I have the following spec: >> >> ################################################################### >> describe ProfilesController do >> describe "GET ''index''" do >> it ''should render active profiles'' do >> active_user = Factory(:user, :active => 1) >> active_user.profile = Factory.build(:profile) >> inactive_user = Factory(:user, :active => 0) >> inactive_user.profile = Factory.build(:profile) >> get ''index'' >> assigns[:profiles].should == [active_user.profile] >> end >> end >> # ...... >> end >> ################################################################### >> >> This spec fails with: >> >> ################################################################### >> ''ProfilesController GET ''index'' should render active profiles'' FAILED >> expected: [#<Profile id: 83, user_id: 80, real_name: "Wendy Moore", >> country: "Yemen, Rep.", icon_file_name: nil, icon_content_type: nil, >> icon_file_size: nil, icon_updated_at: nil, description: "I''ve gotten >> burned over Cheryl Tiegs and blown up f...", personal_website_url: >> "www.google.com", social_network_of_choice: nil, twitter_name: >> "Sarah", created_at: "2010-03-15 11:41:56", updated_at: "2010-03-15 >> 11:41:56">], >> got: [#<Profile id: 83, user_id: 80, real_name: "Wendy Moore", >> country: "Yemen, Rep.", icon_file_name: nil, icon_content_type: nil, >> icon_file_size: nil, icon_updated_at: nil, description: "I''ve gotten >> burned over Cheryl Tiegs and blown up f...", personal_website_url: >> "www.google.com", social_network_of_choice: nil, twitter_name: >> "Sarah", created_at: "2010-03-15 11:41:56", updated_at: "2010-03-15 >> 11:41:56">, #<Profile id: 37, user_id: 37, real_name: nil, country: >> nil, icon_file_name: nil, icon_content_type: nil, icon_file_size: >> nil, >> icon_updated_at: nil, description: nil, personal_website_url: nil, >> social_network_of_choice: nil, twitter_name: nil, created_at: >> "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">, #<Profile >> id: 40, user_id: 40, real_name: nil, country: nil, icon_file_name: >> nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: >> nil, description: nil, personal_website_url: nil, >> social_network_of_choice: nil, twitter_name: nil, created_at: >> "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">, #<Profile >> id: 52, user_id: 52, real_name: nil, country: nil, icon_file_name: >> nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: >> nil, description: nil, personal_website_url: nil, >> social_network_of_choice: nil, twitter_name: nil, created_at: >> "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">] (using ==) >> ################################################################### >> >> As you can see, the problem is that there are more profiles than >> actually expected. >> >> Running this exact spec alone is ok: >> >> ################################################################### >> spec spec/controllers/profiles_controller_spec.rb -l 17 >> . >> >> Finished in 7.743924 seconds >> >> 1 example, 0 failures >> ################################################################### >> >> The same goes for the whole spec-file itself: >> >> ################################################################### >> spec spec/controllers/profiles_controller_spec.rb >> ............ >> >> Finished in 6.108002 seconds >> >> 12 examples, 0 failures >> ################################################################### >> >> A quick debugging via: >> >> ################################################################### >> it ''should render active profiles'' do >> custom_log("Profile-count before: #{Profile.count.to_s}") >> # ........ see code from before >> get ''index'' >> custom_log("Profile-count after: #{Profile.count.to_s}") >> assigns[:profiles].should == [active_user.profile] >> end >> ################################################################### >> >> shows: >> >> ################################################################### >> Profile-count before: 3 >> Profile-count after: 5 >> ################################################################### >> >> Apparently the problem is, that there are still previously created >> profiles around. >> >> As far as I''ve understood rspec, shouldn''t the database be properly >> cleaned up after each spec? >> In other words, shouldn''t there be zero profiles before running the >> spec from above? > > rspec-rails hooks into rails'' transaction management, rolling back > transactions after every example. It does not guarantee that your > database is empty - just that it is in the same state after each > example that it was in before. Now there are a couple of caveats here: > > 1 - you have to have "config.use_transactional_fixtures = true" in > spec/spec_helper.rb > > This is rails'' nomenclature and really means "run each example in a > transaction" > > 2 - if you use before(:all) anywhere in your suite, that code is _not_ > run in a transaction and it is up to you to destroy any data you > create.3. If you make any dirty little direct SQL calls (using ActiveRecord::Base.connection.execute) while the example runs, that will commit the transaction so it''s won''t be rolled back. cheers, Matt http://mattwynne.net +447974 430184
jollyroger
2010-Mar-20 12:20 UTC
[rspec-users] Insufficient database clean-up between specs
David and Matt, ok, i was under the impression that rspec would clean up the database. Got it working now, thanks for the help... On Mar 16, 11:10?am, Matt Wynne <m... at mattwynne.net> wrote:> On 15 Mar 2010, at 12:34, David Chelimsky wrote: > > > > > On Mon, Mar 15, 2010 at 7:24 AM, jollyroger > > <timo.roess... at googlemail.com> wrote: > >> Hey guys, > > >> unfortunately I''ve got one more issue with rspec right now. > > >> It seems like rspec isnt properly cleaning up the database after each > >> spec. > > >> I have the following spec: > > >> ################################################################### > >> describe ProfilesController do > >> ?describe "GET ''index''" do > >> ? ?it ''should render active profiles'' do > >> ? ? ?active_user = Factory(:user, :active => 1) > >> ? ? ?active_user.profile = Factory.build(:profile) > >> ? ? ?inactive_user = Factory(:user, :active => 0) > >> ? ? ?inactive_user.profile = Factory.build(:profile) > >> ? ? ?get ''index'' > >> ? ? ?assigns[:profiles].should == [active_user.profile] > >> ? ?end > >> ?end > >> ?# ...... > >> end > >> ################################################################### > > >> This spec fails with: > > >> ################################################################### > >> ''ProfilesController GET ''index'' should render active profiles'' FAILED > >> expected: [#<Profile id: 83, user_id: 80, real_name: "Wendy Moore", > >> country: "Yemen, Rep.", icon_file_name: nil, icon_content_type: nil, > >> icon_file_size: nil, icon_updated_at: nil, description: "I''ve gotten > >> burned over Cheryl Tiegs and blown up f...", personal_website_url: > >> "www.google.com", social_network_of_choice: nil, twitter_name: > >> "Sarah", created_at: "2010-03-15 11:41:56", updated_at: "2010-03-15 > >> 11:41:56">], > >> ? ? got: [#<Profile id: 83, user_id: 80, real_name: "Wendy Moore", > >> country: "Yemen, Rep.", icon_file_name: nil, icon_content_type: nil, > >> icon_file_size: nil, icon_updated_at: nil, description: "I''ve gotten > >> burned over Cheryl Tiegs and blown up f...", personal_website_url: > >> "www.google.com", social_network_of_choice: nil, twitter_name: > >> "Sarah", created_at: "2010-03-15 11:41:56", updated_at: "2010-03-15 > >> 11:41:56">, #<Profile id: 37, user_id: 37, real_name: nil, country: > >> nil, icon_file_name: nil, icon_content_type: nil, icon_file_size: ? > >> nil, > >> icon_updated_at: nil, description: nil, personal_website_url: nil, > >> social_network_of_choice: nil, twitter_name: nil, created_at: > >> "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">, #<Profile > >> id: 40, user_id: 40, real_name: nil, country: nil, icon_file_name: > >> nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: > >> nil, description: nil, personal_website_url: nil, > >> social_network_of_choice: nil, twitter_name: nil, created_at: > >> "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">, #<Profile > >> id: 52, user_id: 52, real_name: nil, country: nil, icon_file_name: > >> nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: > >> nil, description: nil, personal_website_url: nil, > >> social_network_of_choice: nil, twitter_name: nil, created_at: > >> "2010-03-15 11:21:15", updated_at: "2010-03-15 11:21:15">] (using ==) > >> ################################################################### > > >> As you can see, the problem is that there are more profiles than > >> actually expected. > > >> Running this exact spec alone is ok: > > >> ################################################################### > >> spec spec/controllers/profiles_controller_spec.rb -l 17 > >> . > > >> Finished in 7.743924 seconds > > >> 1 example, 0 failures > >> ################################################################### > > >> The same goes for the whole spec-file itself: > > >> ################################################################### > >> spec spec/controllers/profiles_controller_spec.rb > >> ............ > > >> Finished in 6.108002 seconds > > >> 12 examples, 0 failures > >> ################################################################### > > >> A quick debugging via: > > >> ################################################################### > >> ? ?it ''should render active profiles'' do > >> ? ? ?custom_log("Profile-count before: #{Profile.count.to_s}") > >> ? ? ?# ........ see code from before > >> ? ? ?get ''index'' > >> ? ? ?custom_log("Profile-count after: #{Profile.count.to_s}") > >> ? ? ?assigns[:profiles].should == [active_user.profile] > >> ? ?end > >> ################################################################### > > >> shows: > > >> ################################################################### > >> Profile-count before: 3 > >> Profile-count after: 5 > >> ################################################################### > > >> Apparently the problem is, that there are still previously created > >> profiles around. > > >> As far as I''ve understood rspec, shouldn''t the database be properly > >> cleaned up after each spec? > >> In other words, shouldn''t there be zero profiles before running the > >> spec from above? > > > rspec-rails hooks into rails'' transaction management, rolling back > > transactions after every example. It does not guarantee that your > > database is empty - just that it is in the same state after each > > example that it was in before. Now there are a couple of caveats here: > > > 1 - you have to have "config.use_transactional_fixtures = true" in > > spec/spec_helper.rb > > > This is rails'' nomenclature and really means "run each example in a ? > > transaction" > > > 2 - if you use before(:all) anywhere in your suite, that code is _not_ > > run in a transaction and it is up to you to destroy any data you > > create. > > 3. If you make any dirty little direct SQL calls (using ? > ActiveRecord::Base.connection.execute) while the example runs, that ? > will commit the transaction so it''s won''t be rolled back. > > cheers, > Matt > > http://mattwynne.net > +447974 430184 > > _______________________________________________ > rspec-users mailing list > rspec-us... at rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users