2

저는 Rails 5 앱을 만들고 있어요. 테스트를 위해 Rspec을 사용하고 있습니다. 내가 레일 애플 리케이션을위한 과거에 트래비스 여러 번 사용했지만, 그들은 MiniTest 및 레일 4를 사용하고Ubuntu 12.04 Precise에서 Rails 마이그레이션을 명시 적으로 실행해야하는 이유는 무엇입니까?

나는 로컬 테스트를 실행할 수 있습니다 :

[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 

을하지만 트래비스 테스트를 실행하면 실패합니다 :

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 

내 트래비스의 설정 :

language: ruby 
cache: bundler 

은 내가 확실한 해결책이 전에를 추가하는 것입니다 알고 스크립트를 실행하여 트래비스 구성에 rails db:migrate RAILS_ENV=test을 실행하십시오. 그러나 내 질문은 왜 내가 전에 그것을 할 필요가 없었을 때 이것이 갑자기 필요합니까?

Rails 5의 Rspec 구현에서 변경된 사항이 있습니까? 즉, 테스트가 자동으로 실행되기 전에 마이그레이션이 실행되지 않았습니까? 이 마이 그 레이션을 실행해야 것 같습니다 ... 그래서

# 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! 

:

내가 spec/rails_helper.rb이 라인을 포함 추가해야합니다 (I ...이 일이 사용하는 것입니다 가정 ) . 트래비스의 도움으로

UPDATE 2016년 3월 11일

는, 나는 트래비스 '인프라 외부에서이 문제를 다시 관리했습니다.

Travis는 컨테이너 기반 인프라에서 빌드를 실행하며 해당 이미지 (quay.io/travisci/travis-ruby)는 Ubuntu 12.04.5 (Precise)를 기반으로합니다.

지금과 같이 문제를 다시 만들 수 있습니다 : 나는 로컬 맥 OS 10.12에 데비안 제시에 동일한 작업을 수행하는 경우

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!' 

이 테스트를 통과하고 난 수동 마이그레이션을 실행하도록 요구하고 있지 않다.

우분투 12.04에서 수동 마이그레이션을 실행해야하지만 다른 OS에서는 수동 마이그레이션을 실행해야하는 이유는 무엇입니까?

답변

1

그래서 나는 ActiveRecord가 SQLite gem과 인터페이스하는 방식에서 버그가되는 것을 해결할 수있었습니다. 근본적으로 일어난 일은 ActiveRecord가 SQLite에 명령문을 제출하여 완료된 마이그레이션을 기록하고 SQLite가 일부만 저장하는 것이 었습니다 완료된 마이그레이션의

이 문제는 Ubuntu 12.04 Precise에서 사용할 수있는 최신 SQLite 버전 인 SQLite v3.7.9가 사용되는 경우에만 나타납니다 (다중 삽입 문을 지원하지 않음). 이것은 Travis에서 테스트를 실행할 때 내가 문제를 발견 한 이유를 설명합니다. Travis에서 테스트를 실행하는 것은 기본 배포판과 버전으로 사용됩니다.

GitHub 문제 here을 제기했으며 수정본이 fd87169에 제공되었습니다.

동일한 문제가있는 경우이 픽스를 사용하려면 해당 레일을 포함하는 레일즈 버전을 사용해야하며 작성 시점에는 포함 된 릴리즈가 없으므로 방금 master에서 실행 중입니다. 내 Gemfile에 다음

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

이것은 비록 레일의 다음 릴리스에 포함해야하지만, 우리가 그냥 기다려있어 ...