Rails 5、Rspec: 在模式中找不到环境数据
Rails 5, Rspec: Environment data not found in the schema
将 Rails 应用程序升级到 Rails 5 后,运行 RSpec 测试出现以下错误:
rails aborted!
ActiveRecord::NoEnvironmentInSchemaError:
Environment data not found in the schema. To resolve this issue, run:
bin/rails db:environment:set RAILS_ENV=test
但是,bin
不存在,我似乎无法使用 bundle binstubs rails
或 rake rails:update:bin
.
生成它
我也试过:
rails db:environment:set RAILS_ENV=test
rake db:environment:set RAILS_ENV=test
Github here 上有一个相关问题。
我该如何解决这个错误?
新Rails 5 生成binstubs的命令:
rails app:update:bin
允许我运行 错误建议的解决方案:
bin/rails db:environment:set RAILS_ENV=test
来自@max 评论的提示:如果您正在使用 database_cleaner
并且此错误不断弹出,请将您的配置更改为:
DatabaseCleaner.clean_with(
:truncation,
except: %w(ar_internal_metadata)
)
对我来说,这个错误之后是一个类似的要求迁移的错误。
这成功了:rails db:migrate RAILS_ENV=test
对我来说,我必须做多种事情:
bin/rails db:environment:set RAILS_ENV=test
bin/rails db:migrate RAILS_ENV=test
这会让一切正常,然后我不得不检查我的迁移,我在关系中添加了一个 null:false 并且添加了一个错误,迁移被取消并且没有完成
在删除数据库之前修复 jenkins 应该执行 db:environment:set
和 || true
,这样命令就不会中止:
bin/rails db:environment:set RAILS_ENV=test || true
我不得不删除我的数据库进行测试并重新创建它:
psql
DROP DATABASE your_db_name_test;
bundle exec rake db:create RAILS_ENV=test
之后警告 bin/rails db:environment:set RAILS_ENV=test
消失了。
以上所有答案都是正确的,但是,如果您在一个更独特的项目中,例如开发具有模式概念的 rails 引擎(我知道是 hacky)并且您的迁移失败出于某种原因,您可以 re-run 它而无需检查抛出此异常。示例:
rake environment db:{drop,create,migrate} DISABLE_DATABASE_ENVIRONMENT_CHECK=1
如果您在使用 parallel_tests gem 时碰巧看到此错误,那么您需要为每个数据库执行 运行 下面的命令。只需增加 TEST_ENV_NUMBER.
TEST_ENV_NUMBER=1 bin/rails db:environment:set RAILS_ENV=test
TEST_ENV_NUMBER=2 bin/rails db:environment:set RAILS_ENV=test
当我使用 knapsack_pro gem https://github.com/KnapsackPro/knapsack_pro-ruby#parallel_tests-with-knapsack_pro-on-single-ci-machine
测试 parallel_tests 时,这帮助我解决了问题
将 Rails 应用程序升级到 Rails 5 后,运行 RSpec 测试出现以下错误:
rails aborted!
ActiveRecord::NoEnvironmentInSchemaError:
Environment data not found in the schema. To resolve this issue, run:
bin/rails db:environment:set RAILS_ENV=test
但是,bin
不存在,我似乎无法使用 bundle binstubs rails
或 rake rails:update:bin
.
我也试过:
rails db:environment:set RAILS_ENV=test
rake db:environment:set RAILS_ENV=test
Github here 上有一个相关问题。
我该如何解决这个错误?
新Rails 5 生成binstubs的命令:
rails app:update:bin
允许我运行 错误建议的解决方案:
bin/rails db:environment:set RAILS_ENV=test
来自@max 评论的提示:如果您正在使用 database_cleaner
并且此错误不断弹出,请将您的配置更改为:
DatabaseCleaner.clean_with(
:truncation,
except: %w(ar_internal_metadata)
)
对我来说,这个错误之后是一个类似的要求迁移的错误。
这成功了:rails db:migrate RAILS_ENV=test
对我来说,我必须做多种事情:
bin/rails db:environment:set RAILS_ENV=test
bin/rails db:migrate RAILS_ENV=test
这会让一切正常,然后我不得不检查我的迁移,我在关系中添加了一个 null:false 并且添加了一个错误,迁移被取消并且没有完成
在删除数据库之前修复 jenkins 应该执行 db:environment:set
和 || true
,这样命令就不会中止:
bin/rails db:environment:set RAILS_ENV=test || true
我不得不删除我的数据库进行测试并重新创建它:
psql
DROP DATABASE your_db_name_test;
bundle exec rake db:create RAILS_ENV=test
之后警告 bin/rails db:environment:set RAILS_ENV=test
消失了。
以上所有答案都是正确的,但是,如果您在一个更独特的项目中,例如开发具有模式概念的 rails 引擎(我知道是 hacky)并且您的迁移失败出于某种原因,您可以 re-run 它而无需检查抛出此异常。示例:
rake environment db:{drop,create,migrate} DISABLE_DATABASE_ENVIRONMENT_CHECK=1
如果您在使用 parallel_tests gem 时碰巧看到此错误,那么您需要为每个数据库执行 运行 下面的命令。只需增加 TEST_ENV_NUMBER.
TEST_ENV_NUMBER=1 bin/rails db:environment:set RAILS_ENV=test
TEST_ENV_NUMBER=2 bin/rails db:environment:set RAILS_ENV=test
当我使用 knapsack_pro gem https://github.com/KnapsackPro/knapsack_pro-ruby#parallel_tests-with-knapsack_pro-on-single-ci-machine
测试 parallel_tests 时,这帮助我解决了问题