Rspec 使用开发数据库
Rspec Using Development Database
我将 Rails 4.2 与 Ruby 2.2 和 rspec 一起用于测试用例。我已经设置
Rails.env = 'test'
在我的 spec_helper 和 rails_helper 中。这是我的 database.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
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
宝石文件:
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
当我运行我的测试用例时,Rails.env如预期的那样'test'(用于验证)。但是我的测试用例总是访问开发数据库。
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
最近几个小时以来我一直在摸不着头脑,但似乎没有什么能解开这个谜团。任何帮助将不胜感激!
你的 rails_helper
看起来很奇怪。第一行说:
Rails.env = 'test'
在第一行你还没有加载 Rails(我想你 运行 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/)
在您的规范中的某处,应该会成功通过。
只需将 ENV["RAILS_ENV"] = "test"
放在 rails_helper
的顶部
听起来好像在您的环境中的某个地方(可能是您的 gem 之一)正在将您的环境设置为开发或建立与开发数据库的连接。
要显式连接到测试数据库,请添加:
ActiveRecord::Base.establish_connection
给你的 rails_helper.
麻烦制造者的主要候选者是 `gem 'rails-erd', '~> 1.4.1'。如果您将此设置为在迁移时自动生成图表,则在迁移测试架构时,它将连接到开发数据库以转储图表。
尝试删除此 gem 或“.rake”文件,看看会发生什么。
1) 在 'rails-erd' gem
的声明中添加 require: false
gem 'rails-erd', '~> 1.4.1', require: false
2) 在你的 spec_helper.rb 中,将 Rails.env = 'test'
替换为 ENV['RAILS_ENV'] ||= 'test'
3) 在您的 bin/rspec 中验证您没有任何指令更改 env
[=17= 的值]
4) 然后从命令行停止spring
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['DATABASE_URL']
。
指定要使用的数据库连接有两种方式:
- 指定
ENV['DATABASE_URL']
- 使用非常流行的
database.yml
文件
很多情况下前者优先于后者
在使用 ENV['DATABASE_URL'] 设置我的生产数据库后,我意识到我遇到了与您类似的问题,结果发现我所有的环境(测试和开发)突然开始使用我的生产数据库与 database.yml
.
中的内容无关
为了解决我的问题,我所做的就是将环境变量的名称更改为其他名称,这样它就不会再覆盖我的 database.yml
配置。
阅读本文将解决您的问题:Connection Preference information
我的回答适用于在 Rails 之外使用 Rspec 和 Ruby 的任何人。例如,假设您正在创建 Ruby gem。那么,你仍然可以在项目的配置文件夹中添加一个 database.yml 并指定一个测试选项:
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 范围表示代码块应该在测试套件之前 运行 一次,这意味着您的所有测试。
我将 Rails 4.2 与 Ruby 2.2 和 rspec 一起用于测试用例。我已经设置
Rails.env = 'test'
在我的 spec_helper 和 rails_helper 中。这是我的 database.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
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
宝石文件:
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
当我运行我的测试用例时,Rails.env如预期的那样'test'(用于验证)。但是我的测试用例总是访问开发数据库。
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
最近几个小时以来我一直在摸不着头脑,但似乎没有什么能解开这个谜团。任何帮助将不胜感激!
你的 rails_helper
看起来很奇怪。第一行说:
Rails.env = 'test'
在第一行你还没有加载 Rails(我想你 运行 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/)
在您的规范中的某处,应该会成功通过。
只需将 ENV["RAILS_ENV"] = "test"
放在 rails_helper
听起来好像在您的环境中的某个地方(可能是您的 gem 之一)正在将您的环境设置为开发或建立与开发数据库的连接。
要显式连接到测试数据库,请添加:
ActiveRecord::Base.establish_connection
给你的 rails_helper.
麻烦制造者的主要候选者是 `gem 'rails-erd', '~> 1.4.1'。如果您将此设置为在迁移时自动生成图表,则在迁移测试架构时,它将连接到开发数据库以转储图表。
尝试删除此 gem 或“.rake”文件,看看会发生什么。
1) 在 'rails-erd' gem
的声明中添加require: false
gem 'rails-erd', '~> 1.4.1', require: false
2) 在你的 spec_helper.rb 中,将 Rails.env = 'test'
替换为 ENV['RAILS_ENV'] ||= 'test'
3) 在您的 bin/rspec 中验证您没有任何指令更改 env
[=17= 的值]
4) 然后从命令行停止spring
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['DATABASE_URL']
。
指定要使用的数据库连接有两种方式:
- 指定
ENV['DATABASE_URL']
- 使用非常流行的
database.yml
文件
很多情况下前者优先于后者
在使用 ENV['DATABASE_URL'] 设置我的生产数据库后,我意识到我遇到了与您类似的问题,结果发现我所有的环境(测试和开发)突然开始使用我的生产数据库与 database.yml
.
为了解决我的问题,我所做的就是将环境变量的名称更改为其他名称,这样它就不会再覆盖我的 database.yml
配置。
阅读本文将解决您的问题:Connection Preference information
我的回答适用于在 Rails 之外使用 Rspec 和 Ruby 的任何人。例如,假设您正在创建 Ruby gem。那么,你仍然可以在项目的配置文件夹中添加一个 database.yml 并指定一个测试选项:
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 范围表示代码块应该在测试套件之前 运行 一次,这意味着您的所有测试。