Rspec Using a Development Database

I am using Rails 4.2 with Ruby 2.2 and rspec for test files. I have installed

Rails.env = 'test' 

in both spec_helper and rails_helper. Here is my database.yml file:

 development: adapter: postgresql encoding: unicode database: app_dev pool: 5 username: postgres password: root test: adapter: postgresql encoding: unicode database: app_test pool: 5 username: postgres password: root production: adapter: postgresql encoding: unicode database: app_prod pool: 5 username: postgres password: root 

Here is my rails_helper:

 Rails.env = 'test' require 'spec_helper' require File.expand_path('../../config/environment', __FILE__) require 'rspec/rails' Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } ActiveRecord::Migration.maintain_test_schema! RSpec.configure do |config| config.include JsonHelper config.include PathHelper config.include S3Helper config.fixture_path = "#{::Rails.root}/spec/fixtures" config.use_transactional_fixtures = true config.infer_spec_type_from_file_location! end 

application.rb:

 require File.expand_path('../boot', __FILE__) require 'rails/all' require 'yaml' # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) module AppName class Application < Rails::Application config.generators do |g| g.assets = false g.helper = false g.views = false end # Load all locale files config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] config.i18n.load_path += Dir[Rails.root.join( 'config', 'locales', '**', '**', '*.{rb,yml}')] config.autoload_paths += %W(#{config.root}/lib) config.autoload_paths += Dir["#{config.root}/lib/**/"] config.autoload_paths += Dir["#{config.root}/app/workers/"] config.action_controller.include_all_helpers = false config.active_record.schema_format = :sql config.i18n.available_locales = [:en, :hi, :mr] config.i18n.default_locale = :hi config.i18n.fallbacks = [:en] config.active_record.raise_in_transactional_callbacks = true end end 

Gemfile:

 source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.0' # Use postgresql as the database for Active Record gem 'pg', '~> 0.18.2' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' # Use CoffeeScript for .coffee assets and views gem 'coffee-rails', '~> 4.1.0' # Turbolinks makes following links in your web application faster gem 'turbolinks', '~> 2.5.3' # Use Unicorn as the app server gem 'unicorn', '~> 4.9.0' # Use jquery as the JavaScript library gem 'jquery-rails', '~> 4.0.4' # Integrate the jQuery Validation plugin into the Rails asset pipeline gem 'jquery-validation-rails', '~> 1.13.1' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.0' # bundle exec rake doc:rails generates the API under doc/api. gem 'sdoc', '~> 0.4.0', group: :doc # use swagger for api documentation gem 'swagger-docs', '~> 0.1.9' # for consuming restful web services gem 'httparty', '~> 0.13.5' # for ActiveRecord model/data translations gem 'globalize', '~> 5.0.0' # generates accessors for translated fields gem 'globalize-accessors', '~>0.2.1' # Amazon Web service SDK Ruby gem 'aws-sdk', '~> 2.1.0' # cloud services for S3 gem 'fog', '~> 1.33.0' # handle file uploads gem 'carrierwave', '~>0.10.0' # Photo Resizing gem 'mini_magick', '~> 4.2.7' # Background Jobs gem 'sidekiq', '~> 3.4.2' # Geocoder gem 'geocoder', '~> 1.2.9' # active admin gem 'activeadmin', '~> 1.0.0.pre1' # for authentication gem 'devise', '~> 3.5.1' # for roles of active admin gem 'rolify', '~> 4.0.0' # for authorization gem 'cancan', '~> 1.6.10' group :development, :test do # Debugging using pry gem 'pry-rails', '~> 0.3.4' gem 'pry-byebug', '~> 3.1.0' # testing framework for rails gem 'rspec-rails', '~> 3.1.0' gem 'rspec-collection_matchers', '~> 1.1.2' gem 'factory_girl_rails', '~> 4.4.1' gem 'shoulda-matchers', '~> 2.8.0' # code test coverage gem 'simplecov', '~> 0.7.1' gem 'simplecov-rcov', '~> 0.2.3' # Access an IRB console on exception pages or by using <%= console %> in views gem 'web-console', '~> 2.0' # speeds up development by keeping your application running in the background gem 'spring', '~> 1.3.6' end group :development do # generates ER diagrams for rails application gem 'rails-erd', '~> 1.4.1' end group :test do # set of strategies for cleaning your database gem 'database_cleaner', '~> 1.3.0' end 

When I run my test cases, Rails.env "validates" as expected (used for validation). However, my test cases always fall into the development database.

 Rails.env #=> "test" ActiveRecord::Base.connection_config #=> {:adapter=>"postgresql", :encoding=>"unicode", :database=>"app_dev", :pool=>5, :username=>"postgres", :password=>"root"} 

spec_helper:

 require File.expand_path('../../config/environment', __FILE__) require 'rspec/rails' require 'simplecov' require 'simplecov-rcov' require 'database_cleaner' require 'factory_girl_rails' ENV['RAILS_ENV'] ||= 'test' SimpleCov.start RSpec.configure do |config| config.include FactoryGirl::Syntax::Methods # Database Cleaner config.before(:suite) do DatabaseCleaner.strategy = :transaction DatabaseCleaner.clean_with(:truncation) Rails.application.load_seed end config.before(:each) do DatabaseCleaner.start end config.after(:each) do DatabaseCleaner.clean end config.expect_with :rspec do |expectations| expectations.include_chain_clauses_in_custom_matcher_descriptions = true end config.mock_with :rspec do |mocks| mocks.verify_partial_doubles = true end end SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter 

I have been scratching my head since the last few hours, but it seems that nothing is hiding secrets. Any help would be helpful!

+7
ruby-on-rails rspec
source share
5 answers

It seems that somewhere in your environment (perhaps one of your gems) it is setting your environment to dev or establishing a connection to your dev database.

To explicitly connect to the test database, add:

 ActiveRecord::Base.establish_connection 

to your rails_helper.

The first candidate for the intruder post will be `gem 'rails-erd', '~> 1.4.1'. If you have this as automatically creating a diagram during the transfer, when the test circuit migrates, it will connect to the dev database to upload the diagram.

Try to remove this stone or possibly the ".rake" file and see what happens.

+5
source share

Your rails_helper looks weird. The first line says:

 Rails.env = 'test' 

In the first line, you have not loaded Rails yet (I assume that you are running RSpec with bundle exec rspec ). Therefore, this should cause an error.

So I made a small change to rails_helper :

 require File.expand_path('../../config/environment', __FILE__) Rails.env = 'test' require 'spec_helper' require 'rspec/rails' Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } # the rest 

Now placing

 expect(ActiveRecord::Base.connection_config[:database]).to match(/test/) 

somewhere in your spec should pass successfully.

+5
source share

1) Add require: false to the pearl declaration 'rails-erd'

 gem 'rails-erd', '~> 1.4.1', require: false 

2) In your spec_helper.rb replace Rails.env = 'test' with ENV['RAILS_ENV'] ||= 'test'

3) Check in your bin / rspec (if any) that you do not have an instruction modifying the value of env

4) Then stop spring from the command line

 spring stop 

5) Run your specifications from the command line

 rspec 
+1
source share

Just put ENV["RAILS_ENV"] = "test" at the top of rails_helper

0
source share

You can run rspc with RAILS_ENV=test bundle exec rspec spec

You can also put inside rails_helper.rb

 Rails.env = 'test' 

Also move the testing framework section from development test to test inside gemfile

 group :test do # testing framework for rails gem 'rspec-rails', '~> 3.1.0' gem 'rspec-collection_matchers', '~> 1.1.2' gem 'factory_girl_rails', '~> 4.4.1' gem 'shoulda-matchers', '~> 2.8.0' # set of strategies for cleaning your database gem 'database_cleaner', '~> 1.3.0' end 
0
source share

All Articles