2009-10-15 40 views
111

Tôi đang cố gắng sử dụng cách tải dữ liệu hạt giống chuẩn mới trong Rails 2.3.4+, nhiệm vụ rake db:seed.Làm thế nào để tải db: dữ liệu hạt giống vào cơ sở dữ liệu thử nghiệm tự động?

Tôi đang tải dữ liệu không đổi, được yêu cầu cho ứng dụng của tôi thực sự hoạt động chính xác.

Cách tốt nhất để thực hiện nhiệm vụ db:seed là gì trước khi chạy thử nghiệm, vì vậy dữ liệu được điền trước?

Trả lời

108

Nhiệm vụ rake db:seed chủ yếu chỉ tải tập lệnh db/seeds.rb. Do đó, chỉ cần thực thi tệp đó để tải dữ liệu.

load "#{Rails.root}/db/seeds.rb" 

Vị trí đặt phụ thuộc vào khung kiểm tra bạn đang sử dụng và bạn muốn nó được tải trước mỗi lần kiểm tra hay chỉ một lần ở đầu. Bạn có thể đặt nó trong một cuộc gọi setup hoặc trong một tập tin test_helper.rb.

+4

Tôi thích sự đơn giản, nhưng vì lý do nào đó, việc thêm dòng này vào 'test_helper.rb' của tôi không hoạt động đối với tôi mặc dù http://stackoverflow.com/a/1998520/68210 đã làm. –

+34

Trong các phiên bản mới hơn của đường ray bạn có thể làm: Rails.application.load_seed – Steve

+0

@Steve cảm ơn bạn - bạn có biết đặt Rails.application.load_seed ở đâu nếu có sử dụng rspec/capybarra không? – BKSpurgeon

3

Chúng tôi đang gọi db: hạt giống như một phần của db: kiểm tra: chuẩn bị, với:

Rake::Task["db:seed"].invoke

Bằng cách đó, các dữ liệu hạt giống được nạp một lần cho toàn bộ chạy thử nghiệm, và không một lần cho mỗi lớp thử nghiệm.

+4

Bạn đã tạo một db mới: test: chuẩn bị nhiệm vụ để làm điều đó? Bạn có thể gửi mã không? –

18

Đưa một cái gì đó như thế này trong lib/nhiệm vụ/test_seed.rake nên gọi nhiệm vụ hạt giống sau db: test: tải:

namespace :db do 
    namespace :test do 
    task :load => :environment do 
     Rake::Task["db:seed"].invoke 
    end 
    end 
end 
82

Tôi muốn nói nó phải được

namespace :db do 
    namespace :test do 
    task :prepare => :environment do 
     Rake::Task["db:seed"].invoke 
    end 
    end 
end 

Vì db: test: load không được thực hiện nếu bạn có config.active_record.schema_format =: sql (db: test: clone_structure is)

+4

Chạy cào với '--trace' đã giúp tôi hiểu cách hoạt động của nó. –

+0

Tệp này có tác dụng gì? – BookOfGreg

+4

@BookOfGreg Tôi có nó trong lib/tasks/test_seed.rake mà tôi tạo ra bản thân mình –

2

Thêm Rake::Task["db:seed"].invoke vào nhiệm vụ rake db:test:prepare không hoạt động cho tôi. Nếu tôi chuẩn bị cơ sở dữ liệu với rake db:test:prepare, và sau đó nhập vào bàn điều khiển trong môi trường thử nghiệm, tất cả các hạt giống của tôi đã có. Tuy nhiên, hạt giống không tồn tại giữa các thử nghiệm của tôi. Tuy nhiên,

Tuy nhiên, việc thêm load "#{Rails.root}/db/seeds.rb" vào phương pháp thiết lập của tôi đã hoạt động tốt.

Tôi rất muốn nhận những hạt giống này tự động tải và tồn tại, nhưng tôi chưa tìm được cách để làm điều đó!

3

Đối với những người sử dụng hạt giống, nó thay đổi cách hạt được nạp, vì vậy bạn có thể không/không muốn sử dụng giải pháp load ... được cung cấp tại đây.

Và chỉ cần đặt Rake::Task['db:seed'].invoke vào test_helper dẫn:

Don't know how to build task 'db:seed' (RuntimeError) 

Nhưng khi chúng tôi đã thêm load_tasks trước đó, nó làm việc:

MyApp::Application.load_tasks 
Rake::Task['db:seed'].invoke 
6

Tôi tin Steve's comment trên nên là câu trả lời chính xác. Bạn có thể sử dụng Rails.application.load_seed để tải dữ liệu hạt giống vào môi trường thử nghiệm của mình.Tuy nhiên, khi nào và mức độ thường xuyên dữ liệu này được nạp phụ thuộc vào một vài điều:

Sử dụng Minitest

Không có cách nào thuận tiện để chạy tập tin này một lần trước khi tất cả các bài kiểm tra (xem this Github issue). Bạn sẽ cần phải tải dữ liệu một lần trước mỗi bài kiểm tra, có khả năng trong các phương pháp thiết lập các tập tin thử nghiệm của bạn:

# test/models/my_model_test.rb 
class LevelTest < ActiveSupport::TestCase 

    def setup 
    Rails.application.load_seed 
    end 

    # tests here... 

end 

Sử dụng RSpec

phương pháp before(:all)

Sử dụng RSpec để tải dữ liệu hạt giống cho tất cả các thử nghiệm cho mô hình này :

describe MyModel do 
    before(:all) do 
    Rails.application.load_seed 
end 

describe "my model..." do 
    # your tests here 
end 

Hy vọng điều này sẽ hữu ích.

+2

Câu trả lời hay nhất cho đến nay –

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