Тестовые задачи Rake - PullRequest
       23

Тестовые задачи Rake

24 голосов
/ 10 августа 2009

Я занимаюсь разработкой приложения ROR, которое опирается на множество пользовательских задач Rake.

Как лучше всего их проверить?

Ответы [ 6 ]

17 голосов
/ 15 марта 2011

Что-то вроде:

  def execute_rake(file,task)
    require 'rake'
    rake = Rake::Application.new
    Rake.application = rake
    Rake::Task.define_task(:environment)
    load "#{Rails.root}/lib/tasks/#{file}"
    rake[task].invoke
  end

По вашей спецификации:

execute_rake("tags.rake","tags:popular")
16 голосов
/ 10 августа 2009

Рейк-задачи довольно сложно проверить. Самым простым решением было бы переместить логику в метод соответствующей модели. Затем вы можете проверить это и просто вызвать метод из задачи rake.

4 голосов
/ 10 августа 2009

Это довольно хорошо освещено в еще одном вопросе

Моя рекомендация, повторенная здесь кратко, не состоит в том, чтобы пытаться тестировать грабли: извлеките код, который нужно протестировать, в класс, модель или функцию lib и протестируйте его там. Затем просто используйте rake для вызова функций и управления зависимостями.

1 голос
/ 31 марта 2014

Мне больше всего нравится PivotalLabs '1002 *. Однако я обобщил и изменил их код, как указано в моем приложении:

# file: spec/tasks/my_rake_file_spec.rb
require 'spec_helper'
require 'rake'

describe 'my_rake_file.rake' do
  before :all do
    Rake.application.rake_require 'tasks/my_rake_file'
    Rake::Task.define_task(:environment)
  end

  let(:run_rake_task) {
    Rake::Task[task_name].reenable
    Rake.application.invoke_task task_name
  }

  describe 'my_task_name' do
    let(:task_name) { "my_task_name" }

    it "creates 10 cars" do
      run_rake_task
      Car.count.should == 10
    end
  end
end

Кроме того, я извлек тяжелый код my_rake_file.rake в модуль, который хранится в lib /

0 голосов
/ 14 декабря 2018

Rake-задачи do нуждаются в тестировании, особенно если вы выполняете в нем некоторую пакетную обработку. Тестировать их довольно легко в наши дни:

class CleanExamsTaskTest < ActiveSupport::TestCase
  def test_deletes_results_of_old_exams
    travel_to Time.zone.parse('2010-07-05 10:00')
    @exam.update!(end: Time.zone.parse('2010-07-04 09:59'))

    assert_difference -> { @exam.answered_questions.count }, -1 do
      capture_io { run_task }
    end
  end

  def test_output
    travel_to Time.zone.parse('2010-07-05 10:00')
    @exam.update!(end: Time.zone.parse('2010-07-04 09:59'))

    assert_output("Exams processed: 1\n") { run_task }
  end

  private

  def run_task
    Rake::Task['exams:clean'].execute
  end
end

Полный пример

Протестировано с Ruby> = 1.9 и Rails 5.2. Использует Minitest из stdlib. Других зависимостей нет.

0 голосов
/ 28 апреля 2015

Ну, теперь для этого есть Драгоценный камень:

Fantaskspec - https://github.com/crismali/fantaskspec

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...