2013-06-17 2 views
41

, 루비 2.0.0, 내가 마이그레이션을 실행 한 후 나는 rspec을 통해 테스트를 실행하려고 할 때, 나는 다음과 같은 오류를 참조하십시오'rake db : migrate RAILS_ENV = test'를 실행해야하는 이유는 무엇입니까? 레일 4.0.0.rc1에

/Users/peeja/.rbenv/ 버전 2.0.0-p0/lib/ruby ​​/ gems/2.0.0/gems/activerecord-4.0.0.rc1/lib/active_record/migration.rb : 376 : `check_pending! ': 마이그레이션이 보류 중입니다. 이 문제를 해결하려면 'rake db : migrate RAILS_ENV = test'를 실행하십시오. (ActiveRecord :: PendingMigrationError)

그건 맞지 않습니다. 아무도 테스트 데이터베이스를 이전하지 않습니다. 그들은 db:test:prepare입니다. 공정하게 - 나는 잊어 버렸습니다. 그래서 나는 rake db:test:prepare을 실행하고 내 rspec 명령을 다시 실행합니다 ... 동일한 오류가 발생합니다.

실제로 rake db:migrate RAILS_ENV=test 인 경우 오류는 실제로 사라집니다.

무슨 일 이니? Rails 4에서 새로 추가 되었습니까?

+0

합니까'레이크 dB : 시험 : prepare' 작품 이 문장은 내 문제를 해결? – itsnikolay

+2

'schema.rb'가 최신 버전이라하더라도'rake db : test : prepare'는 작동하지 않습니다. 테스트 데이터베이스 만 마이그레이션합니다. – Kris

+0

내 대답을 체크 아웃 여기, 도움이되기를 바랍니다 : http://stackoverflow.com/a/33054787/4902373 –

답변

53

레일 4.1로, rake db:test:* 작업이되지 않습니다 작동

rake db:migrate RAILS_ENV=test 

을 시도 할 수 있습니다. 대신, (test|spec)_helper.rb은 다음을 포함한다 :

ActiveRecord::Migration.maintain_test_schema! 

이 당신이 레이크 작업 여부에서 그들을 실행 여부를 테스트 데이터베이스가 올바른 스키마 귀하의 테스트를 실행할 때마다 얻을 것을 의미합니다.

+0

그 중 하나를 주셔서 감사합니다. 실제로 4.1 버전이 출시되었을 때 제가 놓친 것 같습니다. – jipiboily

+1

이것은 정확하고 테스트 데이터베이스를 최신 상태로 유지하는 가장 좋은 방법입니다. run_에 대한 보류중인 마이그레이션이 있습니다. 그러나 누군가이 위대한 해결 방법을 따르고 싶지 않으면 테스트 데이터베이스를 삭제하고 테스트 데이터베이스를 다시 작성하기 위해'rake db : create RAILS_ENV = test'를 실행하고'rake db : migrate RAILS_ENV = test'만으로 테스트 데이터베이스를 마이그레이션 할 수 있습니다. 나는 종종 내 응용 프로그램에 대한 테스트를 작성할 때이 작업을 수행합니다. –

+1

레일즈의'tests_helper.rb'에서이 라인을 볼 수 있습니다. – Abhilash

23

rake test:prepare처럼 보이지만, 무엇을 db:test:prepare 지금 할 수 있는지 모르겠습니다.

+0

와우. 머리 위로 쳐. 감사! https://gist.github.com/Peeja/5831155 레일스 버그 파일을 보내십시오 ... – Peeja

+1

허. 처음에 내가 놓친 것을 게시했을 때'test : prepare' *는'db : test : prepare'를 호출합니다. 좋은 것들은'db : test : prepare' 밖에서 발생하는 것처럼 보입니다. 레일스 코드는 다음과 같습니다 : https://github.com/rails/rails/blob/067e1505d4e054df566e065f4faf11ee4b430a3d/activerecord/lib/active_record/railties/databases.rake#L399 – Peeja

+0

데이터베이스가 'schema.rb'에서' db : test : prepare'를 호출하는'test : prepare' 함수를 호출합니다. 그러나'db : test : load'는'db : test : prepare'에서 직접 호출됩니다. – Kris

5

또한 수행

db:test:prepare 

로 :

+5

실제로 그렇지 않습니다. 'rake db : migrate RAILS_ENV = test'는 테스트 데이터베이스를 마이그레이션합니다. 'rake db : test : prepare'는 테스트 데이터베이스에 스키마를로드 할 것이고, 오류가 발생하기 쉽고 빠릅니다. – Peeja

9

가끔 한 사람의 답을 따를 때이 문제를 해결하는 데 어려움이 있습니다. 그래서 더 나은 결과를 얻기 위해 부부를 던졌습니다. 다음은 내가 취한 조치입니다. 어떤 것이 불필요한 것인지 확실하지 않지만, 결국에는 효과가 있습니다.

  1. test_helper.rb 파일 상단에 ActiveRecord::Migration.maintain_test_schema!을 추가하십시오. 내가 bundle exec rake test을 실행할 때
  2. rake db:migrate RAILS_ENV=test

  • rake db:migrate
  • rake test:prepare
  • 는 그럼 난 깨끗한 결과를 전혀중인 마이그레이션에 모든 시간을 얻을. (이것은 처음으로 스캐 폴드를 생성 한 직후에하는 일입니다.) 누군가가 이러한 단계 중 하나가 절대적으로 필요하지 않다는 것을 알고 있다면 나를 고칠 수는 있지만, 이것이 매번 작동하는지 확인하는 방법입니다.

    1

    chruby을 사용하여 루비 버전을 관리 할 때이 문제가 있음을 발견했습니다. Rails는 시스템 명령을 통해 bin/rails db:test:prepare을 호출합니다. 이것은 chrubys $PATH env var를 이용하지 않기 때문에 시스템 루비가 무엇이든간에 실행되며, 일반적으로 누락 된 보석 때문에 실패합니다.불행히도, 나는 현재 이것에 대한 좋은 해결책이 없습니다.

    +1

    와우, 어떻게 찾았습니까? 나는 또한 chruby를 사용하고 있으며, ActiveRecord :: Migration.maintain_test_schema!는 단순히 나를 위해 작동하지 않는다. 어떻게 디버그 했습니까? 모든 수정 사항? –

    2

    이와 같이 변수 BEFORE 명령을 설정할 수 있습니다.

    RAILS_ENV=test rake db:migrate 
    
    +2

    이것은 질문에 대답하지 않습니다. 문제는 오류를 해결하는 방법이 아니라 마이그레이션을 실행해야하는 이유입니다. – Ievgen