2

Je construis une application Rails 5 et j'utilise Rspec pour les tests. Je l'ai utilisé Travis à plusieurs reprises dans le passé pour les applications Rails, mais ils utilisaient MiniTest et Rails 4.Pourquoi ai-je besoin d'exécuter explicitement les migrations Rails sous Ubuntu 12.04 Precise?

Je peux exécuter des tests sur place:

[email protected] ~/Code/acrm $ rake db:drop 
Dropped database 'db/development.sqlite3' 
Database 'db/test.sqlite3' does not exist 
[email protected] ~/Code/acrm $ RAILS_ENV=test bundle exec rake 
/Users/joenyland/.rvm/rubies/ruby-2.3.0/bin/ruby -I/Users/joenyland/.rvm/gems/[email protected]/gems/rspec-core-3.5.4/lib:/Users/joenyland/.rvm/gems/[email protected]/gems/rspec-support-3.5.0/lib /Users/joenyland/.rvm/gems/[email protected]/gems/rspec-core-3.5.4/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb 
*............................. 

Pending: (Failures listed here are expected and do not affect your suite's status) 

    1) SessionsHelper add some examples to (or delete) /Users/joenyland/Code/acrm/spec/helpers/sessions_helper_spec.rb 
    # Not yet implemented 
    # ./spec/helpers/sessions_helper_spec.rb:14 


Finished in 1.87 seconds (files took 15.63 seconds to load) 
30 examples, 0 failures, 1 pending 

Mais quand Travis exécute les tests, il échoue:

0K$ bundle exec rake 
/home/travis/.rvm/rubies/ruby-2.3.0/bin/ruby -I/home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib:/home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-support-3.5.0/lib /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb 
/home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/migration.rb:572:in `check_pending!': (ActiveRecord::PendingMigrationError) 

Migrations are pending. To resolve this issue, run: 

    bin/rails db:migrate RAILS_ENV=test 

    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/migration.rb:585:in `load_schema_if_pending!' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/migration.rb:591:in `block in maintain_test_schema!' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/migration.rb:822:in `suppress_messages' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/migration.rb:596:in `method_missing' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/migration.rb:591:in `maintain_test_schema!' 
    from /home/travis/build/MasterRoot24/acrm/spec/rails_helper.rb:27:in `<top (required)>' 
    from /home/travis/build/MasterRoot24/acrm/spec/models/client_spec.rb:1:in `require' 
    from /home/travis/build/MasterRoot24/acrm/spec/models/client_spec.rb:1:in `<top (required)>' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1435:in `load' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1435:in `block in load_spec_files' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1433:in `each' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1433:in `load_spec_files' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:100:in `setup' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:86:in `run' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:71:in `run' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:45:in `invoke' 
    from /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/exe/rspec:4:in `<main>' 
/home/travis/.rvm/rubies/ruby-2.3.0/bin/ruby -I/home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib:/home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-support-3.5.0/lib /home/travis/build/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb failed 

config Mon Travis:

language: ruby 
cache: bundler 

Je sais que la solution évidente est d'ajouter un avant script à la configuration Travis pour exécuter rails db:migrate RAILS_ENV=test. Cependant, ma question est pourquoi est-ce soudainement nécessaire quand je n'ai jamais eu besoin de le faire avant?

Est-ce que quelque chose a changé dans l'implémentation de Rspec pour Rails 5, ce qui signifie que les migrations ne sont pas exécutées automatiquement avant les tests maintenant? (Je suppose c'est ce qui se passait ...)

Je dois ajouter que spec/rails_helper.rb contient les lignes:

# Checks for pending migration and applies them before tests are run. 
# If you are not using ActiveRecord, you can remove this line. 
ActiveRecord::Migration.maintain_test_schema! 

... donc on dirait qu'il devrait être en cours d'exécution les migrations .

MISE À JOUR 3/11/2016

Avec un peu d'aide de Travis, j'ai réussi à recréer cette question en dehors de l'infrastructure de Travis. Travis fonctionne sur leur infrastructure basée sur des conteneurs et leur image (quay.io/travisci/travis-ruby) est basée sur Ubuntu 12.04.5 (Précis).

Je peux maintenant recréer la question comme ceci:

docker run -it ubuntu:precise /bin/bash 

apt-get update && apt-get install git bash-completion curl nodejs -y && gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 && \curl -sSL https://get.rvm.io | bash -s stable && source /etc/profile.d/rvm.sh && rvm install 2.3.0 && git clone --depth=50 --branch=master https://github.com/MasterRoot24/acrm.git MasterRoot24/acrm && cd MasterRoot24/acrm && rvm use 2.3.0 && gem install bundler && export BUNDLE_GEMFILE=$PWD/Gemfile && bundle install --jobs=3 --retry=3 --deployment --path=${BUNDLE_PATH:-vendor/bundle} && bundle exec rake 

[email protected]:/MasterRoot24/acrm# bundle exec rake 
/usr/local/rvm/rubies/ruby-2.3.0/bin/ruby -I/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib:/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-support-3.5.0/lib /MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb 
/MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/migration.rb:572:in `check_pending!': (ActiveRecord::PendingMigrationError) 

Migrations are pending. To resolve this issue, run: 

    bin/rails db:migrate RAILS_ENV=test 

    from /MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/migration.rb:585:in `load_schema_if_pending!' 
    from /MasterRoot24/acrm/vendor/bundle/ruby/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/migration.rb:591:in `block in maintain_test_schema!' 

Si je fais la même localement sur macOS 10,12 ou dans Debian Jessie, tests passent et je ne suis pas demandé d'exécuter une migration manuelle. Pourquoi aurais-je besoin d'une migration manuelle sous Ubuntu 12.04, mais pas sous un autre système d'exploitation?

Répondre

1

Donc, j'ai été en mesure de comprendre que ActiveRecord s'interface avec la gemme SQLite et qu'essentiellement ActiveRecord soumettait des instructions à SQLite pour enregistrer les migrations terminées et que SQLite en stockait seulement des migrations terminées.

Ce problème ne survient que lorsque SQLite v3.7.9 est utilisé (qui ne prend pas en charge les instructions multi-insert), qui est la dernière version de SQLite disponible pour Ubuntu 12.04 Precise. Cela explique pourquoi je n'ai rencontré le problème que lorsque j'exécutais des tests dans Travis, car c'est la distribution par défaut et la version qu'ils utilisent.

J'ai soulevé un problème GitHub here et un correctif a été fourni dans fd87169.Pour utiliser ce correctif si vous avez le même problème, vous devez utiliser une version de Rails qui l'inclut et au moment de l'écriture il n'y a pas de version qui l'inclut, donc je viens de tourner à master avec ce qui suit dans mon Gemfile:

gem 'rails', github: 'rails/rails' 

Cela devrait être inclus dans une future version de Rails bien, mais nous devons simplement attendre ...