Rails: сообщите этой грабли, что она находится в тестовой среде - PullRequest
16 голосов
/ 03 апреля 2011

У меня в папке lib/tasks определена следующая задача rake:

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

Теперь, что это делает, это заполняет тестовую базу данных, когда я запускаю rake db:test:prepare. Я делаю это потому, что у меня есть некоторые базовые записи, которые должны существовать, чтобы приложение могло функционировать, поэтому они не являются обязательными и не могут быть по-настоящему подделаны.

Отдельно у меня есть модель, которая использует S3 для хранения активов при разработке и производстве, но я не хочу, чтобы она использовала S3 для тестирования. Я настроил метод в модели, который изменяет путь хранения с S3 на локальный, если Rails.env.test?

Однако это не работает. Мне было интересно, знает ли задача rake о том, из какой среды она вызывается, и оказывается, что это НЕ. Я положил это в начало моего файла seed.rb:

puts "Environment Check: Rails Environment = #{Rails.env}"

Конечно, когда задача запускается, это печатает: Environment Check: Rails Environment = development

Итак, как я могу повторить эту задачу rake, чтобы при заполнении тестовой БД она знала, что она заполняет тестовую БД ??

Ответы [ 2 ]

15 голосов
/ 30 апреля 2011

У меня тоже была эта проблема; в моем файле db/seeds.rb есть блок, который создает учетные записи пользователей в среде разработки, но они также создавались при подготовке тестовой среды для запуска rake для тестирования RSpec или Cucumber, что привело к появлению красной стены.

Обновлено : я обнаружил, что лучший способ указать среду для задач rake - это указать среду в задаче, прежде всего операторы, которым требуется среда задавать. Так что в этом случае:

Rails.env = 'test'
Rake::Task["db:seed"].invoke

делает работу.

8 голосов
/ 03 апреля 2011

Из чтения источника db: test задачи, похоже, что они заботятся только о получении информации о тестовой базе данных из database.yml, но не заботятся, в какой реальной среде они это делают.

Возможно, вам потребуется запустить rake db: test: prepare RAILS_ENV = test, чтобы убедиться, что вы находитесь в тестовой среде.

...