Выполнение Rake-задач в Rspec Tests - PullRequest
49 голосов
/ 01 августа 2011

Я создаю набор интеграционных тестов, и есть одна логика, для которой мне нужна чистая база данных. Как я могу запустить задачу db:test:purge внутри одного из моих тестов?

Я использую: ruby ​​1.9.2, рельсы 3.0.9, rspec 2.6

Ответы [ 4 ]

55 голосов
/ 01 августа 2011

Вы можете вызвать задачи Rake следующим образом:

require 'rake'
Rake::Task[name].invoke

В этом случае это приведет к следующему коду:

require 'rake'
Rake::Task['db:test:purge'].invoke
34 голосов
/ 14 ноября 2013

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

Вот мое решение

Поместить в начало спецификации файл

require 'rake'

Поместите эти строки там, где вам нужно выполнить пользовательскую задачу rake, например, rake update_data из файла example.rake

load File.expand_path("../../../lib/tasks/example.rake", __FILE__)
# make sure you set correct relative path 
Rake::Task.define_task(:environment)
Rake::Task["update_data"].invoke

Моя среда:

rails (4.0.0)
ruby (2.0.0p195)
rspec-core (2.14.7) 
rspec-expectations (2.14.3) 
rspec-mocks (2.14.4) 
rspec (2.14.1) 
rspec-rails (2.14.0) 
10 голосов
/ 08 марта 2016

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

require "rake"
Rails.application.load_tasks

Затем просто вызвать любую задачу.

Rake::Task['sync:process_companies'].invoke

Хотя я не могу подтвердить, если она медленнее, потому что она загружает всезадачи

0 голосов
/ 24 июля 2018

Нам нужно также запросить задачу

require 'rake'
Rake.application.rake_require 'tasks/new_adapter'

После этого просто вызовите задачу

Rake::Task['new:adapter'].invoke
...