Thanks for your response, Neil. My problem is somewhat different but I imagine that your solution may help someone else.
It turns out that there is a known issue with Rails leaving fixture data in the DB after a TestCase runs. (http://dev.rubyonrails.org/ticket/2404) Therefore this actually was a Rails issue, not a cruisecontrol.rb issue. My tests would pass when running "rake test" from the command line because "rake test" builds the test DB schema from schema.rb. Schema.rb is created by db:schema:dump which ignores foreign keys. So I've been running my tests against a DB without the foreign keys. The issue only showed up with cruisecontrol because cruise builds the test DB directly from the migrations. For now, I've created a :cruise rake task that builds in the same way as "rake test" (without foreign keys). I set up dev and test databases for cruisecontrol and then invoke the rake tasks "db:migrate" and "test" in my :cruise task. desc 'Continuous build target' task :cruise do Rake::Task['db:migrate'].invoke Rake::Task["test"].invoke end This runs the migrations against the development DB, moves the schema to the test DB without the foreign keys, and runs the tests. When I figure out how to properly handle fixtures with foreign keys I'll change the task to reflect it. Thanks again for all your help. - Patrick Joyce On Nov 8, 2007 2:53 PM, Neill Zero <[EMAIL PROTECTED]> wrote: > > > > Patrick Joyce wrote: > > > > Did anyone ever find a solution to this? My tests pass when I run "rake > > test" in the work directory but when cc.rb runs the tests I get an error > > on every test after the test in which the Schedules fixture is loaded. All > > tests before the schedules fixture is loaded pass. It seems as though that > > table isn't being cleared. Any idea why this would happen? > > > > Hi Patrick, > > I had a similar but not identical issue some time ago. I traced it to the > fact that rake, under the standard cruise build task, was not executing > db:test:purge every time it was "invoked". In my case, my migrations loaded > seed data into the tables, which was not then purged before tests ran. > Fixture loading then caused FK constraint violations. At the time, I worked > around the issue with a custom build task to use under cruise which did > almost the same but forced a purge at the critical point. > > Here's the detail of what I found, and the workaround I used. Hopefully it > is also applicable in your situation. > > To understand the problem, I needed to understand what 'rake test' was > doing. I've put a diagram of the dependencies at > http://abstractplain.net/blog/?p=1019. > > If we look at a trace of the test task in a stand-alone rake invocation, > side-by-side with the cruise build task, and if we look only at what tasks > are actually being *executed* (rather than invoked) we have the following > (view it with a fixed width font): > > rake stand-alone cruise build > ---------------------------------------------------------- > Execute cc:build > Execute environment > Execute db:test:purge > Execute db:migrate > Execute db:schema:dump > Execute test Execute test > Execute environment < > Execute db:test:prepare Execute db:test:prepare > Execute db:schema:dump < > Execute db:test:purge < > Execute db:test:clone Execute db:test:clone > Execute db:schema:load Execute db:schema:load > [runs tests] [runs tests] > > You can see that on the cruise side, the tasks 'environment', > 'db:schema:dump' and 'db:test:purge' are not called when running the test > task! If you look at a fuller trace, you'll see it is being invoked (the > db:test:clone requires it) but not executed! Rake thinks this declared > "dependency" has been met, because rake called them earlier in the cruise > task; cruise invokes "db:test:purge" explicitly on line 49 of > tasks/cc_build.rake (in cruise v1.1.0), and then 'db:migrate' a little > later. > > So no purge is being done between cruise's running of migrations and running > the tests. In my case (where migrations populated some tables with seed > data), I believe that this meant that when the tests ran, even before > fixtures were loaded, there was data in the test db. FK constraint > violations occurred when the fixtures tried to delete and load their tables, > due to the presence of these left-over records). Do your migrations include > seed data? > > I got around this issue by having cruise run a custom task. Mine does > almost exactly what cruise's standard build task does, but also ensures that > purge is executed when it needs to be. > > A better solution might involve ensuring that cruise's calls to > 'db:test:purge', 'db:migrate', and 'test' are have separate rake contexts. > > Finally, here's my custom task for building under cruise. ( I've also > posted it at: http://abstractplain.net/blog/?p=1024 ) > > #This builds from migrations each time (slower, but more reliable). > #Must then empty seed data before tests start to delete stuff, or FK > constraints get violated. > #NOTE: currently needs db:test:purgetwo to exist (just copy paste > db:test:purge task) > task :cruise do > ENV['RAILS_ENV'] = 'test' > puts "custom cruise task invoked. env is hardcoded to test" > > Rake::Task["environment"].invoke > > #start from scratch with just the test db > Rake::Task["db:test:purge"].invoke > > #necessary to reconnect, as purge drops database (and w mysql the conn) > CruiseControl::reconnect > > #run all migrations from scratch. slow but clean > Rake::Task["db:migrate"].invoke > > #empty the db of data - migration has loaded seed data into the tables, > #which'll be deleted badly by test fixtures loader. > > #NOTE: db:test:purgetwo is just a quick hack to force this > #identical action to be called again > #TODO: replace with the correct way to force execution of a task in rake > Rake::Task["db:test:purgetwo"].invoke > > #necessary to reconnect, as purge drops database (and w mysql the conn) > CruiseControl::reconnect > > #the migration has already done a schema dump > Rake::Task["db:schema:load"].invoke > > success = Rake::Task["test"].invoke > success > end > > > #good luck, neill > > -- > View this message in context: > http://www.nabble.com/rake-build-issue-related-to-foreign-key-constraints--tf4221922.html#a13654415 > > > > Sent from the CruiseControl.rb - Users mailing list archive at Nabble.com. > > _______________________________________________ > Cruisecontrolrb-users mailing list > [email protected] > http://rubyforge.org/mailman/listinfo/cruisecontrolrb-users > _______________________________________________ Cruisecontrolrb-users mailing list [email protected] http://rubyforge.org/mailman/listinfo/cruisecontrolrb-users
