这个让我有点困惑。
全新Rails 6.1.3、Ruby 2.7.0应用程序,带有Rspec和database_cleaner
在设置了应用程序和Rspec之后,我只为User模型创建了一个快速单元测试,然后创建了一次快速请求测试来检查默认的根页面。
我遇到的第一个问题是请求测试失败。该请求没有显示根页面,而只是显示一个带有Home的h1标签,而是返回了一条错误消息,称www.example.com是一个被阻止的主机,并将example.com添加到config.hosts 中
这是我第一次遇到这种情况,不久前我用Rails 6.1和Ruby 2.6.4创建了另一个应用程序,基本上是相同的配置,但从未出现过阻塞主机的问题。
因此,我在test.rb环境中将example.com添加到config.hosts中。同样的问题。我把它添加到development.rb环境文件中,它就通过了。这应该是我的第一个危险信号。
在开发模式下摆弄我的应用程序并测试用户注册、添加、删除用户之后。我再次运行了我的测试套件,然后发现我在开发中玩过的所有数据都不见了。所以我意识到Rspec实际上是在开发环境中运行的,并且运行在我的开发数据库上。尽管我的rails_helper.rb文件确实有ENV['rails_ENV']|='test'行。
我能让它正常运行的唯一方法是明确地运行我的rspec,如下所示:RAILS_ENV=";测试";bundle exec rspec spec/requests/pages_spec.rb
但我从来没有这样做过。甚至在我最近创建的应用程序中也没有。这是Rails 6.1.3的新功能吗?或者可能是更新的版本或Rspec?
有人遇到过这样的事吗?让我困惑的是,这两个Rails应用程序的创建时间可能相隔几个月,除了Ruby版本和Rails版本不同之外,其他的宝石几乎都是一样的。
以下是特定文件的详细信息
Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.7.0'
gem 'rails', '~> 6.1.3'
gem 'pg', '~> 1.1'
gem 'puma', '~> 5.0'
gem 'sass-rails', '>= 6'
gem 'webpacker', '~> 5.0'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.7'
gem 'bootsnap', '>= 1.4.4', require: false
gem 'devise', '~> 4.7', '>= 4.7.3'
gem 'interactor', '~> 3.0'
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
gem 'faker'
group :development, :test do
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
gem 'factory_bot_rails', '6.1.0'
gem 'rspec-rails', '4.0.2'
gem 'spring-commands-rspec'
end
group :development do
gem 'web-console', '>= 4.1.0'
gem 'rack-mini-profiler', '~> 2.0'
gem 'listen', '~> 3.3'
gem 'spring'
end
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
group :test do
gem 'capybara', '3.35.0'
gem 'selenium-webdriver', '3.142.6'
gem 'database_cleaner'
gem 'geckodriver-helper'
gem 'webdrivers', '4.1.2'
end
rails_helper.rb
require 'spec_helper'
require 'factory_bot_rails'
require 'devise'
require 'database_cleaner'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../config/environment', __dir__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
begin
ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
puts e.to_s.strip
exit 1
end
RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
config.include FactoryBot::Syntax::Methods
config.include ControllerMacros, type: :request
config.include Features::SessionHelpers, type: :feature
config.include Devise::Test::IntegrationHelpers, type: :request
config.include Devise::Test::IntegrationHelpers, type: :view
config.include Devise::Test::IntegrationHelpers, type: :feature
config.include Warden::Test::Helpers
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.around(:each) do |example|
DatabaseCleaner.cleaning do
example.run
end
end
config.after(:each) do
Warden.test_reset!
end
config.infer_spec_type_from_file_location!
config.filter_rails_from_backtrace!
Capybara.javascript_driver = :selenium_chrome
FactoryBot::SyntaxRunner.class_eval do
include ActionDispatch::TestProcess
include ActiveSupport::Testing::FileFixtures
end
end
database.yml
# PostgreSQL. Versions 9.3 and up are supported.
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000
development:
<<: *default
database: trunfo_development
host: localhost
pool: 5
username: <%= ENV.fetch("DB_USER") %>
password: <%= ENV.fetch("DB_PASSWORD") %>
test:
<<: *default
database: trunfo_test
host: localhost
pool: 5
username: <%= ENV.fetch("DB_USER") %>
password: <%= ENV.fetch("DB_PASSWORD") %>
尝试在project_name/test/test_helper.rb
中设置ENV['RAILS_ENV'] ||= 'test'
也许某个地方RAILS_ENV已经被设置为";测试";。你试过把env打印出来看看吗?在辅助文件中写入ENV['RAILS_ENV']='test'会有什么不同吗?