Question

I'm running unit tests on Rails 2.3 and I keep getting errors along these lines when I run rake test:units:

10) Error:
test_the_truth(BrokerTest):
ActiveRecord::StatementInvalid: Mysql::Error: Table 'shadow_test.users' doesn't exist: DELETE FROM `users`
    /Library/Ruby/Gems/1.8/gems/after_commit-1.0.10/lib/after_commit/connection_adapters.rb:14:in `transaction'

I ran rake db:test:load prior to this, and it created the tables. However, when I check mysql after running the unit tests command, the tables are indeed missing. Something in the process of preparing for the unit tests causes the tables to go missing. Here's the debug log from running the test:

WARNING: 'task :t, arg, :needs => [deps]' is deprecated.  Please use 'task :t, [args] => [deps]' instead.
    at /Users/me/sources/shadow/lib/tasks/turk.rake:53
** Invoke test:units (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment 
** Execute db:test:purge
** Execute db:test:load
** Invoke db:schema:load (first_time)
** Invoke environment 
** Execute db:schema:load
** Execute test:units
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -I"lib:test" -I"/Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib" "/Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb" "test/unit/**/*_test.rb" 
/Library/Ruby/Gems/1.8/gems/bundler-1.1.3/lib/bundler/runtime.rb:211: warning: Insecure world writable dir /usr/local/git/bin in PATH, mode 040777
NOTE: Gem.source_index is deprecated, use Specification. It will be removed on or after 2011-11-01.
Gem.source_index called from /Library/Ruby/Gems/1.8/gems/rails-2.3.14/lib/rails/gem_dependency.rb:21.
WARNING: using the built-in Timeout class which is known to have issues when used for opening connections. Install the SystemTimer gem if you want to make sure the Redis client will not hang.
/Users/me/sources/shadow/test/unit/../test_helper.rb:36: warning: already initialized constant BEANSTALK
Loaded suite /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader
Started
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
Finished in 3.389328 seconds.

Some more background: I'm using Octopus for sharding and that may be somehow interfering with things??

Was it helpful?

Solution

Using the Octopus database sharding gem has a few issues on test case preparation. See GitHub issue: https://github.com/tchandy/octopus/issues/31.

You have a few options, the easiest of which is to disable Octopus for your development environment. Remove "- development" from your shards.yml file.

Otherwise, you can patch the issue by adding task:

 task :reconnect_octopus do
   if ActiveRecord::Base.connection.is_a?(Octopus::Proxy)
     ActiveRecord::Base.connection.initialize_shards(Octopus.config)
   end
 end
 task :'db:test:clone_structure' => :reconnect_octopus

or for Rails 3:

 task :reconnect_octopus do
   if ActiveRecord::Base.connection.is_a?(Octopus::Proxy)
     ActiveRecord::Base.connection.initialize_shards(Octopus.config)
   end
 end
 task :'db:structure:load' => :reconnect_octopus

This should stem off your issue listed above. Happy coding!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top