db : seed 데이터를 테스트 데이터베이스에 자동으로로드하는 방법은 무엇입니까?


122

저는 db:seed레이크 작업 인 Rails 2.3.4+에서 시드 데이터를로드하는 새로운 표준 방식을 사용하려고합니다 .

내 응용 프로그램이 실제로 올바르게 작동하는 데 필요한 상수 데이터를로드하고 있습니다.

db:seed데이터가 미리 채워지도록 테스트 전에 작업을 실행 하는 가장 좋은 방법은 무엇입니까 ?

답변:


120

db:seed레이크 작업은 주로 단지로드 db/seeds.rb스크립트를. 따라서 해당 파일을 실행하여 데이터를로드하십시오.

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

# or

Rails.application.load_seed

사용중인 테스트 프레임 워크와 매 테스트 전에로드할지 아니면 처음에 한 번로드할지에 따라 배치 할 위치입니다. setup전화 나 test_helper.rb파일 에 넣을 수 있습니다.


4
나는 단순함을 좋아하지만 어떤 이유로이 줄을 추가하면 stackoverflow.com/a/1998520/68210test_helper.rb작동했지만 나를 위해 작동 하지 않았습니다.
Daniel X Moore

37
최신 버전의 레일에서는 다음을 수행 할 수 있습니다. Rails.application.load_seed
Steve

@Steve 감사합니다-예를 들어 rspec / capybarra를 사용하는 경우 Rails.application.load_seed를 어디에 넣을지 알고 있습니까?
BKSpurgeon

1
@BKSpurgeon 특정 데이터를 실행해야하고 공장이 너무 복잡하기 때문에 응용 프로그램에서 시드 데이터를 상당히로드합니다. rails_helper 파일 Rails.application.load_seed바로 아래 require 'rspec/rails'에 넣었 습니다 . 당신이 database_cleaner 보석을 사용하는 경우 - 당신이 각각의 테스트 후 종자 데이터가 손실되지 않도록하기 위해 약간의 조정이 필요합니다 그리고 당신은 찾을 수 보석의 문서에 자기
MageeWorld

Rails 5.x에서 나는 이것을 test/test_helper.rb기존 require 'rails/test_help'라인 뒤에 추가했습니다
Andrew

87

나는 그것이되어야한다고 말할 것이다

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

config.active_record.schema_format = : sql (db : test : clone_structure is)이있는 경우 db : test : load가 실행되지 않기 때문에


4
rake with를 실행 --trace하면 이것이 어떻게 작동하는지 이해하는 데 도움이되었습니다.
자레드 벡

4
@BookOfGreg 나는 나 자신을 만든 lib 디렉토리 / 작업 / test_seed.rake에이
유진 Bolshakov을

6
이건 왜 안돼? task 'db:test:prepare' => 'db:seed'
Carson Reinke 2013 년

3
Rails 4.0.0 최종 추가 ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])이전Rake::Task["db:seed"].invoke
janic_ 2013-08-08

3
@CarsonReinke- db:seed실행 시 환경이 이상하기 때문 development입니다.
denishaskin 2013-09-13

17

lib / tasks / test_seed.rake에 다음과 같이 넣으면 db : test : load 이후에 seed 작업이 호출되어야합니다.

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

15

저는 믿습니다 스티브의 댓글이 위의 정답해야합니다. 를 사용 Rails.application.load_seed하여 테스트 환경에 시드 데이터를로드 할 수 있습니다 . 그러나이 데이터가로드되는시기와 빈도는 몇 가지 사항에 따라 다릅니다.

Minitest 사용

모든 테스트 전에이 파일을 한 번 실행하는 편리한 방법은 없습니다 ( 이 Github 문제 참조 ). 테스트 파일의 설정 방법에서와 같이 각 테스트 전에 데이터를 한 번로드해야합니다.

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

  def setup
    Rails.application.load_seed
  end

  # tests here...

end

RSpec 사용

RSpec의 before(:all)방법을 사용 하여이 모델의 모든 테스트에 대한 시드 데이터를로드합니다.

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

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

도움이 되었기를 바랍니다.


2
우수 답변까지
유리 Ghensev

before(:suite)대신 에서 호출한다는 점을 제외하면 비슷한 작업을 수행합니다 before(:all). 형식화 된 코드를 포함하기 위해 별도의 답변을 게시했습니다.
Mark Schneider

3

다음과 같이 db : test : prepare의 일부로 db : seed를 호출합니다.

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

이렇게하면 시드 데이터가 테스트 클래스 당 한 번이 아니라 전체 테스트 실행에 대해 한 번로드됩니다.


4
이를 위해 새로운 db : test : prepare 작업을 생성 했습니까? 코드를 게시 할 수 있습니까?
Luke Francl

3

seedbank를 사용하는 사람들의 경우 씨앗이로드되는 방식이 변경되므로 load ...여기에 제공된 솔루션 을 사용하고 싶지 않을 수 있습니다.

그리고 Rake::Task['db:seed'].invoketest_helper 에 넣으면 다음과 같은 결과가 나타납니다.

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

그러나 그 전에 load_tasks를 추가하면 작동했습니다.

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

2

레이크 작업에 추가 Rake::Task["db:seed"].invoke하는 것이 db:test:prepare저에게 효과적이지 않았습니다. 로 데이터베이스를 준비한 rake db:test:prepare다음 테스트 환경에서 콘솔에 들어가면 모든 시드가 거기에있었습니다. 그러나 씨앗은 내 테스트 사이에 지속되지 않았습니다.

load "#{Rails.root}/db/seeds.rb"그래도 내 설정 방법에 추가하면 잘 작동했습니다.

이 씨앗이 자동으로로드되고 지속되도록하고 싶지만 아직 방법을 찾지 못했습니다!


0

Matt의 답변을 바탕으로 이러한 종류의 경로 를 사용하는 경우 파일 Rails.application.load_seedbefore(:suite)블록이 rspec_helper.rb아닌 블록에서 호출 하는 것이 좋습니다 before(:all). 이렇게하면 시드 코드가 각 테스트 그룹에 대해 한 번이 아니라 전체 테스트 스위트에 대해 한 번만 호출됩니다.

rspec_helper.rb :

RSpec.configure do |config|
  ...
  config.before(:suite) do
    Rails.application.load_seed
  end
  ...
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.