Rails 5,Rspec:架构中未找到环境数据

Posted

技术标签:

【中文标题】Rails 5,Rspec:架构中未找到环境数据【英文标题】:Rails 5, Rspec: Environment data not found in the schema 【发布时间】:2016-11-07 15:07:36 【问题描述】:

将 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 railsrake rails:update:bin 生成它。

我也试过了:

rails db:environment:set RAILS_ENV=test
rake db:environment:set RAILS_ENV=test

Github 上有一个相关问题here。

我该如何解决这个错误?

【问题讨论】:

一般来说:这是一个可怕的、过度设计的、过于复杂的变化。 env RAILS_ENV=whatever bin/rake db:migrate spec 以前工作得很好 【参考方案1】:

用于生成 binstub 的新 Rails 5 命令:

rails app:update:bin

允许我按照错误提示运行解决方案:

bin/rails db:environment:set RAILS_ENV=test

来自@max 评论的提示:如果您使用的是database_cleaner,并且此错误不断弹出,请将您的配置更改为:

DatabaseCleaner.clean_with(
  :truncation,
  except: %w(ar_internal_metadata)
)

【讨论】:

如果您正在使用database_cleaner 并且此错误不断弹出,请将您的配置更改为DatabaseCleaner.clean_with :truncation, except: %w(ar_internal_metadata) - github.com/DatabaseCleaner/database_cleaner/issues/445 天哪,db_cleaner 解决方案有效! :P 不知道该表中设置了环境。 database_cleaner >= 1.6.2 必须 have fixed 问题。请注意,如果您在服务器上运行 CI 测试,则在那里构建的所有项目都应该有 database_cleaner >= 1.6.2 %w(ar_internal_metadata) 解决方法对我不起作用。 (导轨 6,黄瓜导轨 2.0.0,mysql)。还有其他想法吗? ^^ 和 database_cleaner 1.7.0(所以它在 1.6.2 中没有固定)【参考方案2】:

对我来说,这个错误之后是一个类似的要求迁移的错误。

这成功了:rails db:migrate RAILS_ENV=test

【讨论】:

【参考方案3】:

在删除数据库之前修复 jenkins,您应该执行 db:environment:set|| true,因此该命令不会中止:

bin/rails db:environment:set RAILS_ENV=test || true

【讨论】:

【参考方案4】:

以上所有答案都是正确的,但是,如果您在一个更独特的项目中,例如开发具有模式概念的 rails 引擎(我知道这很奇怪)并且您的迁移由于某种原因而失败,您可以在不检查引发此异常的情况下重新运行它。示例:

rake environment db:drop,create,migrate DISABLE_DATABASE_ENVIRONMENT_CHECK=1

【讨论】:

【参考方案5】:

对我来说,我不得不做多种事情:

bin/rails db:environment:set RAILS_ENV=test
bin/rails db:migrate RAILS_ENV=test

这将使事情顺利进行,然后我不得不检查我的迁移,我在关系中添加了一个 null:false 并添加了一个错误,迁移被取消并且没有完成

【讨论】:

【参考方案6】:

我不得不删除我的数据库进行测试并重新创建它:

    psql DROP DATABASE your_db_name_test; bundle exec rake db:create RAILS_ENV=test

之后,bin/rails db:environment:set RAILS_ENV=test 的警告消失了。

【讨论】:

4. bundle exec rake db:migrate RAILS_ENV=test【参考方案7】:

如果您在使用 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 5,Rspec:架构中未找到环境数据的主要内容,如果未能解决你的问题,请参考以下文章

Circle CI 上的 Rspec 测试失败(Ruby on Rails 5.2.3)

.env 未使用 rspec 在 Rails 的测试环境中加载

使用 Rails 3.2.11 和 RSpec 发布原始 JSON 数据

Rails 教程 - Ch. 5 更漂亮的测试 Rspec

Rails 3.1,RSpec:测试模型验证

rake 规范不使用 rails 环境