I'm having some issues with cucumber & database transactions - specifically, when I run the test suite, database transactions are not cleaned afterwards.
I'm running rails 3.1 with spork, postgres.
Initially features/support/env.rb was set to use database_cleaner, but consistently got the following error on each call to the db:
No database specified. Missing argument: database. (ArgumentError) /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0.rc4/lib/active_record/connection_adapters/postgresql_adapter.rb:22:in
postgresql_connection' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0.rc4/lib/active_record/connection_adapters/abstract/connection_pool.rb:292:in
new_connection' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0.rc4/lib/active_record/connection_adapters/abstract/connection_pool.rb:302:incheckout_new_connection' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0.rc4/lib/active_record/connection_adapters/abstract/connection_pool.rb:254:in
block (2 levels) in checkout' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0.rc4/lib/active_record/connection_adapters/abstract/connection_pool.rb:250:inloop' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0.rc4/lib/active_record/connection_adapters/abstract/connection_pool.rb:250:in
block in checkout' /Users/john/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/monitor.rb:201:inmon_synchronize' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0.rc4/lib/active_record/connection_adapters/abstract/connection_pool.rb:249:in
checkout' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0.rc4/lib/active_record/connection_adapters/abstract/connection_pool.rb:151:inconnection' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0.rc4/lib/active_record/connection_adapters/abstract/connection_pool.rb:388:in
retrieve_connection' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0.rc4/lib/active_record/connection_adapters/abstract/connection_specification.rb:107:inretrieve_connection' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/cucumber-rails-1.0.2/lib/cucumber/rails/hooks/active_record.rb:7:in
connection' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/database_cleaner-0.6.7/lib/database_cleaner/active_record/transaction.rb:17:inclean' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/database_cleaner-0.6.7/lib/database_cleaner/base.rb:77:in
clean' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/database_cleaner-0.6.7/lib/database_cleaner/configuration.rb:56:inblock in clean' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/database_cleaner-0.6.7/lib/database_cleaner/configuration.rb:56:in
each' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/database_cleaner-0.6.7/lib/database_cleaner/configuration.rb:56:inclean' /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/cucumber-rails-1.0.2/lib/cucumber/rails/hooks/database_cleaner.rb:9:in
After'
I tried reverting to regular transactions, but no joy. I can access the database via the console (cucumber environment) and create/delete/retrieve records with no problems. The config/database.yml, features/support/env.rb, config/environments/cucumber.rb and rspec/spec_helper.rb files are added below. Any suggestions very appreciated - this one has had me stumped for some time:
CONFIG/DATABASE.yml
default: &defaults
adapter: postgresql
username: rails_dev
password: foobar
development:
<<: *defaults
database: fcct_d
test: &test
<<: *defaults
database: fcct_t
production:
<<: *defaults
database: fcct_p
username: fcct
password: k#1*5Avb3dTa
cucumber:
adapter: postgresql
username: rails_dev
password: foobar
database: fcct_t
FEATURES/SUPPORT/ENV.RB
require 'rubygems'
require 'spork'
Spork.prefork do
require 'cucumber/rails'
require 'database_cleaner'
require 'database_cleaner/cucumber'
Capybara.default_selector = :css
ActionController::Base.allow_rescue = false
begin
DatabaseCleaner.strategy = :transaction
rescue NameError
raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
end
end
Spork.each_run do
require 'factory_girl'
require File.join(File.dirname(__FILE__), '../../lib/existing_factory/existing_factory.rb')
end
CONFIG/ENVIRONMENTS/CUCUMBER.RB
BusinessschoolCorporate::Application.configure do # Settings specified here will take precedence over those in config/application.rb
# The test environment is used exclusively to run your application's
test suite. You never need to work with it otherwise. Remember
that # your test database is "scratch space" for the test suite and is wiped # and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
config.use_transactional_fixtures = true# Configure static asset server for tests with Cache-Control for performance config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"# Log error messages when you accidentally call methods on nil
config.whiny_nils = true# Show full error reports and disable caching
config.consider_all_requests_local = true
config.action_controller.perform_caching = false# Raise exceptions instead of rendering exception templates
config.action_dispatch.show_exceptions = false# Disable request forgery protection in test environment
config.action_controller.allow_forgery_protection = false# Tell Action Mailer not to deliver emails to the real world. # The :test delivery method accumulates sent emails in the # ActionMailer::Base.deliveries array.
config.action_mailer.delivery_method = :test# Use SQL instead of Active Record's schema dumper when creating the test database. # This is necessary if your schema can't be completely dumped by the schema dumper, # like if you have constraints or database-specific column types # config.active_record.schema_format = :sql
# Print deprecation notices to the stderr
config.active_support.deprecation = :stderr end
SPEC/SPEC_HELPER.RB
require 'rubygems' require 'spork'
Spork.prefork do # Loading more in this block will cause your tests to run faster. However, # if you change any configuration or code from libraries loaded here, you'll # need to restart spork for it take effect. # This file is copied to spec/ when you run 'rails generate rspec:install' ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", FILE) require 'rspec/rails'
# Requires supporting ruby files with custom matchers and macros, etc, # in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/*/.rb")].each {|f| require f}RSpec.configure do |config| # == Mock Framework # # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line: # # config.mock_with :mocha # config.mock_with :flexmock # config.mock_with :rr config.mock_with :rspec
# Remove this line if you're not using ActiveRecord or
ActiveRecord fixtures # config.fixture_path = "#{::Rails.root}/spec/fixtures"
# If you're not using ActiveRecord, or you'd prefer not to run
each of your # examples within a transaction, remove the following line or assign false # instead of true. config.use_transactional_fixtures = true end
end
Spork.each_run do # This code will be run each time you run your specs.
end
Why don't you try putting
config.use_transactional_fixtures = true
in yourCONFIG/ENVIRONMENTS/CUCUMBER.RB
file?For those wondering - it was the fact that I had &defaults in my config/database.yml file. Database cleaner has a 'defaults' call of its own, which intercepts the config info.