Rspec С Использованием Базы Данных Разработки

Я использую Rails 4.2 с Ruby 2.2 и rspec для тестовых наборов. Я установил

Rails.env = 'test'

в моей spec_helper и rails_helper. Вот моя база данных.файл yml:

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

вот мой 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

приложение.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

когда я запускаю свои тестовые случаи, рельсы.env-это "тест", как и ожидалось (используется pry для проверки). однако мои тестовые случаи всегда поражают разработка баз данных.

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

я чешу голову с последних нескольких часов, но ничего не решает загадку. Любая помощь была бы замечательной!

7 ответов


это звучит так, как будто где-то в вашей среде (возможно, один из ваших драгоценных камней) он устанавливает вашу среду в dev или устанавливает соединение с вашей базой данных dev.

чтобы явно подключить его к тестовой базе данных, добавьте:

ActiveRecord::Base.establish_connection

к вашему rails_helper.

главным кандидатом на troublemaker будет " gem "rails-erd", "~ > 1.4.1". Если у вас есть это как автоматическое создание диаграммы при переносе, при переносе схемы тестирования она подключится к база данных dev для дампа диаграммы.

Попробуйте удалить этот камень или возможно '.досье рейка и посмотрим, что получится.


код rails_helper выглядит странно. Первая строка гласит:

Rails.env = 'test'

в первой строке у вас еще нет загруженных рельсов (я полагаю, вы запускаете RSpec с помощью bundle exec rspec). Поэтому он должен вызвать ошибку.

поэтому я внес небольшое изменение в 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

ставим

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

где-то в вашей спецификации, должно пройти успешно.


1) Добавить require: false к объявлению "rails-erd" gem

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

2) в spec_helper.rb заменить Rails.env = 'test' by ENV['RAILS_ENV'] ||= 'test'

3) Проверьте в своем bin / rspec (если присутствует), что у вас нет инструкции, изменяющей значение env

4) затем остановите пружину из командной строки

spring stop

5) запустите спецификации из командной строки

rspec

вы можете запустить rspc с RAILS_ENV=test bundle exec rspec spec

также вы можете положить внутрь rails_helper.rb

Rails.env = 'test'

также переместите раздел рамки тестирования из теста разработки для тестирования внутри 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

просто поставить ENV["RAILS_ENV"] = "test" в верхней части rails_helper


причина тесты поразить разработка баз данных, потому что вы определили ENV['DATABASE_URL'] где-то в вашей среде.

существует два способа указания используемого подключения к базе данных:

  1. задание ENV['DATABASE_URL']
  2. используя очень популярный

во многих случаях первый prescedence над вторыми.

я понял, что у меня была проблема, похожая на вас после использование ENV ['DATABASE_URL'] для установки моей рабочей базы данных, только чтобы узнать, что все мои среды (test & development) внезапно начали использовать мою рабочую базу данных независимо от содержимого в database.yml.

чтобы решить мою проблему, все, что я сделал, это изменил имя переменной среды на что-то другое, чтобы она больше не перезаписывала мой database.yml конфигурации.

чтение этого решит вашу проблему:Настройки Подключения информация


мой ответ относится ко всем, кто использует Rspec с Ruby вне Rails. Например, предположим, вы создаете рубиновый камень. Ну, вы все еще можете добавить базу данных.yml в папке config в вашем проекте и укажите тестовый параметр:

test:
  adapter: 'mysql2'
  encoding: utf8mb4
  collation: utf8mb4_bin
  pool: 1
  username: root
  password:
  host: localhost
  database: 'my_site_test'

теперь вы можете добавить в spec_helper.rb:

  config.before :suite do
    ActiveRecord::Base.establish_connection(YAML.load(File.open(File.expand_path("../../lib/my_gem_config/database.yml", __FILE__)))["test"])
  end  

область :suite указывает, что блок кода должен быть запущен один раз перед набором тестов, что означает все ваши тесты.