Rails 5, Rspec: Environment data not found in the schema
Ruby on-RailsRspecRspec RailsRuby on-Rails-5Ruby on-Rails Problem Overview
After upgrading a Rails app to Rails 5, running RSpec tests gives me the following error:
rails aborted!
ActiveRecord::NoEnvironmentInSchemaError:
Environment data not found in the schema. To resolve this issue, run:
bin/rails db:environment:set RAILS_ENV=test
However, that bin
does not exist and I can't seem to generate it with bundle binstubs rails
or with rake rails:update:bin
.
I have also tried:
rails db:environment:set RAILS_ENV=test
rake db:environment:set RAILS_ENV=test
There is a related issue on Github here.
How can I address this error?
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
New Rails 5 command to generate binstubs:
rails app:update:bin
Allows me to run the solution as the error suggested:
bin/rails db:environment:set RAILS_ENV=test
Tip from @max comment: If you are using database_cleaner
and this error keeps popping up then change your config to:
DatabaseCleaner.clean_with(
:truncation,
except: %w(ar_internal_metadata)
)
Solution 2 - Ruby on-Rails
For me, this error was followed by a similar one asking for a migration.
This did the trick: rails db:migrate RAILS_ENV=test
Solution 3 - Ruby on-Rails
fix for jenkins before you drop database you should execute db:environment:set
with || true
, so the command doesn't abort:
bin/rails db:environment:set RAILS_ENV=test || true
Solution 4 - Ruby on-Rails
All of the above answers are correct, however, if you're in a more unique project such as developing a rails engine with a concept of a schema (hacky, I know) and your migration fails for some reason, you can re-run it without the check that throws this exception. Example:
rake environment db:{drop,create,migrate} DISABLE_DATABASE_ENVIRONMENT_CHECK=1
Solution 5 - Ruby on-Rails
For me, I had to do a mixture of things:
bin/rails db:environment:set RAILS_ENV=test
bin/rails db:migrate RAILS_ENV=test
This would make things work, and then I had to review my migrations, I was adding a null:false into a relationship and that added a bug, the migration was cancelled and didn't finish
Solution 6 - Ruby on-Rails
I had to drop my database for tests and create it again:
psql
DROP DATABASE your_db_name_test;
bundle exec rake db:create RAILS_ENV=test
After that the warning bin/rails db:environment:set RAILS_ENV=test
disappeared.
Solution 7 - Ruby on-Rails
If you happen to see this error while using parallel_tests gem then you need to run below command for each DB. Just increase 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
This helped me fix the problem when I was testing parallel_tests with knapsack_pro gem https://github.com/KnapsackPro/knapsack_pro-ruby#parallel_tests-with-knapsack_pro-on-single-ci-machine