Могу ли я переопределить task : environment в test_helper.rb для тестирования задач rake?
Вопрос
У меня есть ряд задач rake в Rakefile, которые я хотел бы протестировать как часть моих спецификаций и т.д.Каждая задача определяется в форме:
task :do_somthing => :environment do
# Do something with the database here
end
Где задача :environment устанавливает соединение с базой данных ActiveRecord / DataMapper и классы.Я не использую это как часть Rails, но у меня есть серия тестов, которые я хотел бы запустить как часть BDD.
Этот фрагмент иллюстрирует, как я пытаюсь протестировать задачи rake.
def setup
@rake = Rake::Application.new
Rake.application = @rake
load File.dirname(__FILE__) + '/../../tasks/do_something.rake'
end
should "import data" do
@rake["do_something"].invoke
assert something_in_the_database
end
Итак, моя просьба о помощи - возможно ли переопределить задачу:environment в моем файле test_helper.rb, чтобы мое тестирование rake взаимодействовало с моей тестовой базой данных, а не с производственной?Я попытался переопределить задачу в вспомогательном файле, но это не сработало.
Любая помощь в поиске решения была бы замечательной, так как я зациклился на этом всю прошлую неделю.
Решение
Моим "решением" подобной проблемы было извлечь всю логику из моих файлов .rake и создать классы для выполнения задач, оставив только однострочный вызов в файле rake, который, я был уверен, не будет тестироваться слишком усердно.Затем классы можно было бы протестировать практически в обычном режиме.
Я не знаю, насколько хорошо это соответствовало бы сложному набору взаимозависимых задач, которые поддерживают некое далеко идущее состояние:вероятно, не очень хорошо, но опять же, это, скорее всего, указывает на какую-то другую проблему дизайна...
Мне любопытно посмотреть, не пропустил ли я чего-нибудь получше.
Редактировать:Раньше там была запись в блоге здесь это (а) говорит то же самое и (б) говорит лучше.Похоже, он тоже сказал это первым.
Другие советы
Я думаю, вы ищете эту строку:требовать(File.join(RAILS_ROOT, 'config', 'environment')) это именно то, что вы найдете в реализации "задача: среда"
Я использую его для тестирования своих задач rake с использованием rspec
когда вы запускаете тесты, загружаемая среда является тестовой.
таким образом, вы взаимодействуете только с тестовой базой данных.
Так что я не вижу никаких причин переопределять вашу задачу rake в test_helper.rb