2013-06-17 31 views
41

On Rails 4.0.0.rc1, Ruby 2.0.0, sau khi tôi chạy một di dân, tôi thấy lỗi sau khi tôi cố gắng chạy một thử nghiệm thông qua rspec:Tại sao tôi được yêu cầu chạy 'rake db: migrate RAILS_ENV = test'?

/Users/peeja/.rbenv/ phiên bản/2.0.0-p0/lib/ruby ​​/ đá quý/2.0.0/đá quý/activerecord-4.0.0.rc1/lib/active_record/migration.rb: 376: trong 'check_pending': Di cư đang chờ giải quyết; chạy 'rake db: di chuyển RAILS_ENV = test' để giải quyết vấn đề này. (ActiveRecord :: PendingMigrationError)

Điều đó có vẻ không đúng. Không ai di chuyển cơ sở dữ liệu thử nghiệm của họ, phải không? Họ db:test:prepare nó, công bằng - tôi đã quên làm. Vì vậy, tôi chạy rake db:test:prepare và chạy lại lệnh rspec của mình… và thấy cùng một lỗi.

Nếu tôi thực sự rake db:migrate RAILS_ENV=test, sai số không trên thực tế đi.

Điều gì đang xảy ra? Đây có phải là mới trong Rails 4?

+0

'rake db: test: prepare' có hoạt động không? – itsnikolay

+2

Đối với tôi 'rake db: test: preparation' không hoạt động ngay cả khi' schema.rb' được cập nhật. Chỉ di chuyển cơ sở dữ liệu thử nghiệm hoạt động. – Kris

+0

Thanh toán câu trả lời của tôi ở đây, hy vọng nó sẽ giúp: http://stackoverflow.com/a/33054787/4902373 –

Trả lời

53

Tính đến Rails 4.1, các rake db:test:* nhiệm vụ không được tán thành. Thay vào đó, (test|spec)_helper.rb của bạn nên bao gồm:

ActiveRecord::Migration.maintain_test_schema! 

Điều này có nghĩa rằng cơ sở dữ liệu thử nghiệm của bạn sẽ nhận được các lược đồ đúng mỗi lần xét nghiệm của bạn chạy, cho dù bạn chạy chúng từ một nhiệm vụ Rake hay không.

+0

Cảm ơn vì điều đó, tôi đã thực sự bỏ lỡ một khi 4,1 đã được phát hành tôi đoán. – jipiboily

+1

Điều này là đúng và là cách tốt nhất để tôi cập nhật cơ sở dữ liệu thử nghiệm của bạn. Lỗi là _you có di chuyển đang chờ xử lý để chạy_. Nhưng nếu bất cứ ai không muốn làm theo cách giải quyết tuyệt vời này, tôi đề nghị bạn xóa cơ sở dữ liệu thử nghiệm và chạy afresh 'rake db: tạo RAILS_ENV = test' để tạo lại cơ sở dữ liệu thử nghiệm của bạn, và chạy' rake db: migrate RAILS_ENV = test' chỉ để di chuyển cơ sở dữ liệu thử nghiệm. Tôi làm điều này thường xuyên khi chưa viết các bài kiểm tra cho ứng dụng của tôi. –

+1

Tôi có thể thấy dòng này trong 'tests_helper.rb' trong đường ray 5 ngoài hộp – Abhilash

23

Hình như rake test:prepare công trình, không chắc chắn những gì db:test:prepare bây giờ không.

+0

Ồ. Đánh nó lên đầu. Cảm ơn! https://gist.github.com/Peeja/5831155 Bây giờ để gửi một lỗi Rails… – Peeja

+1

Huh. Khi tôi lần đầu tiên đăng rằng tôi đã bỏ lỡ 'test: prepare' * là * gọi (tùy thuộc vào)' db: test: preparation'. Tất cả những thứ tốt dường như xảy ra bên ngoài 'db: test: prepare', mặc dù vậy. Đây là mã Rails: https://github.com/rails/rails/blob/067e1505d4e054df566e065f4faf11ee4b430a3d/activerecord/lib/active_record/railties/databases.rake#L399 – Peeja

+0

Dường như cơ sở dữ liệu được tạo từ 'schema.rb' trong ' db: test: load' trong đó 'test: prepare' gọi sau' db: test: prepare'. Nhưng nó cũng giống như 'db: test: load' được gọi trực tiếp từ từ' db: test: prepare'. – Kris

5

Bạn cũng có thể thử

rake db:migrate RAILS_ENV=test 

mà hoạt động như

db:test:prepare 

không :)

+5

Nó không, thực sự. 'rake db: di chuyển RAILS_ENV = test' sẽ di chuyển cơ sở dữ liệu thử nghiệm. 'rake db: test: prepare' sẽ (sẽ) nạp giản đồ vào cơ sở dữ liệu thử nghiệm, nhanh hơn và ít bị lỗi hơn. – Peeja

9

tôi vẫn gặp khó khăn đôi khi trong phân loại vấn đề này ra khi tôi chỉ cần làm theo câu trả lời của một người vì vậy tôi đã ném một vài với nhau để có được kết quả tốt hơn. Dưới đây là các bước tôi thực hiện, không chắc chắn những bước nào là không cần thiết, nhưng nó hoạt động cuối cùng.

  1. thêm ActiveRecord::Migration.maintain_test_schema! vào đầu tệp test_helper.rb.
  2. rake test:prepare
  3. rake db:migrate
  4. rake db:migrate RAILS_ENV=test

Sau đó, khi tôi chạy bundle exec rake test tôi nhận được kết quả sạch mỗi khi không có di cư chưa giải quyết. (Đây là những gì tôi làm ngay sau khi tạo giàn giáo lần đầu tiên). Có người cảm thấy tự do để sửa tôi nếu bạn biết chắc chắn rằng một trong những bước này là hoàn toàn không cần thiết, nhưng đây là cách tôi đảm bảo nó hoạt động mọi lúc.

1

tôi đã tìm thấy tôi có vấn đề này khi sử dụng chruby để quản lý các phiên bản ruby ​​của tôi. Đường ray gọi bin/rails db:test:prepare thông qua lệnh hệ thống. Điều này không tận dụng lợi thế của chrubys $PATH env var, do đó, nó chạy như bất cứ điều gì ruby ​​hệ thống, và thất bại vì thiếu đá quý thường.Thật không may, tôi hiện không có một giải pháp tốt cho việc này.

+1

Chà, làm cách nào bạn tìm thấy nó? Tôi cũng đang sử dụng 'chruby' và' ActiveRecord :: Migration.maintain_test_schema! 'Chỉ đơn giản là không làm việc cho tôi. Làm thế nào bạn gỡ lỗi nó? Mọi bản sửa lỗi? –

2

Bạn có thể thử đặt lệnh BEFORE biến, như thế này. Tuyên bố này đã giải quyết được sự cố của tôi:

RAILS_ENV=test rake db:migrate 
+2

Điều này không trả lời được câu hỏi. Câu hỏi đặt ra là: tại sao chúng ta cần phải chạy quá trình di chuyển này chứ không phải cách khắc phục lỗi. – Ievgen

Các vấn đề liên quan