2015-01-13 2 views
0

У меня есть seeds.rb Заполнение моей базы данных разработки. И я знаю, что могу легко применить seeds.rb к моей тестовой базе данных с помощью:Как засеять тестовые данные в Rails, не используя seeds.rb?

rake db:seed RAILS_ENV=test 

Однако я хочу другоеseeds.rb файл, чтобы заполнить мою тестовую базу данных. Возможно seeds_test.rb. Это должно быть чрезвычайно распространенным требованием среди программистов-рельсов, не так ли?

Если нет простого способа сделать это, например rake db:seed:seeds_test RAILS_ENV=test, то как мне создать задачу рейка? Я думаю, что что-то подобное в lib/tasks/test_seeds.rake:

namespace :db do 
    desc "Seed data for tests" 
    task :seed_test => :environment do 
    load "#{Rails.root}/db/seeds_test.rb" 
    end 
end 

Я думаю, что будет работать, но я бы хотел, чтобы моя задача рек автоматически знать, чтобы применить это только к тестовой базе данных без меня указать:

rake db:seed_test RAILS_ENV=test 

Как получить задачу грабли, так что все я должен ввести в командной строке:

rake db:seed_test 

UPDATE: Другой StackOverflow вопрос был связан, когда ответ должен был сделать это:

Rails.env = 'test' 

К сожалению, не делает ничего (по крайней мере, по состоянию на Rails 4.2) :(.

+0

Возможный дубликат [Rails: сделать эту задачу рейка осведомленной о том, что она находится в тестовой среде] (http: // stackoverfl ow.com/questions/5525757/rails-make-this-rake-task-aware-that-it-is-in-the-test-environment) – Amadan

+0

К сожалению, ответ на этот дублирующий вопрос (который на самом деле не является дубликатом) не работает :(. 'Rails.env = 'test'' фактически не изменяет среду, и данные семени попадают в базу данных разработки. –

+0

Не так ли? Я просто тестировал его, и он определенно работает для меня (данные добавлены только в 'test.sqlite3'). (Я скопировал ваш код, поместил 'Rails.env = 'test'' чуть выше' load'.) Я также запускаю Rails 4.2.0. – Amadan

ответ

7

В db/seeds.rb, тест для значения Rails.env и выполнить соответствующий высева:

#db/seeds.rb 
case Rails.env 
when 'development' 
    # development-specific seeds ... 
    # (anything you need to interactively play around with in the rails console) 

when 'test' 
    # test-specific seeds ... 
    # (Consider having your tests set up the data they need 
    # themselves instead of seeding it here!) 

when 'production' 
    # production seeds (if any) ... 

end 

# common seeds ... 
# (data your application needs in all environments) 

Если вы хотите использовать отдельные файлы, просто require их внутри этой структуры, например:

#db/seeds.rb 
case Rails.env 
when 'development' 
    require 'seeds_development'  
when 'test' 
    require 'seeds_test' 
when 'production' 
    require 'seeds_production' 
end 

require 'seeds_common' 

или короче

#db/seeds.rb 
require "seeds_#{Rails.env}" 
require 'seeds_common' 
+0

Это не моя проблема. Я хочу всегда писать в тестовую базу данных. –

+0

О, я думал, что определение пользовательской задачи 'rake' для записи семантичных тестов в тестовую базу данных было только тем, что вы хотели сделать, если бы не было простого способа, чтобы иметь' rake db: seed RAILS_ENV = test' write test- конкретных семян в вашу тестовую базу данных. –

+0

Вам нужно использовать двойные кавычки для интерполяции строк: 'require 'seeds _ # {Rails.env}" ' –

0

Если вы используете spring, вы можете set a Rails environment for a rake task:

# config/spring.rb 
Spring::Commands::Rake.environment_matchers['db:seed_test'] = "test" 

или для всех задач, соответствующих регулярное выражение:

# config/spring.rb 
Spring::Commands::Rake.environment_matchers[/^db:.+_test$/] = "test" 

Это позволяет вызывать

rake db:seed_test 

и запустить его в test Rails environment, таким образом записывая в ваш test DB.

Однако, это не имеет никакого эффекта

  • если spring не используются для грабель
    или
  • если задача рек не вызываются непосредственно (например, из командной строки), но как зависимость от другой задачи рейка, не соответствующей шаблону
+0

Это выглядит очень интересно, попробуем завтра –

Смежные вопросы