тестирование rake-задач с помощью Rspec не принимает аргументы

Я пытаюсь написать тест Rspec для одной из моих рейк-задач, согласно это сообщение Стивена Хагеманна.

lib/tasks/retry.rake:

namespace :retry do

  task :message, [:message_id] => [:environment] do |t, args|
    TextMessage.new.resend!(args[:message_id])
  end
end

spec/tasks/retry_spec.rb:

require 'rails_helper'
require 'rake'

describe 'retry namespace rake task' do
  describe 'retry:message' do
    before do
      load File.expand_path("../../../lib/tasks/retry.rake", __FILE__)
      Rake::Task.define_task(:environment)
    end

    it 'should call the resend action on the message with the specified message_id' do
      message_id = "5"
      expect_any_instance_of(TextMessage).to receive(:resend!).with message_id
      Rake::Task["retry:message[#{message_id}]"].invoke
    end

  end
end

Однако, когда я запускаю этот тест, я получаю следующую ошибку:

Don't know how to build task 'retry:message[5]'

С другой стороны, когда я запускаю задачу без аргумента, как:

Rake::Task["retry:message"].invoke

Я могу вызвать задачу rake, но тест не проходит, так как нет message_id.

Что не так с тем, как я передаю аргумент в задачу rake?

Спасибо за помощь.


person x6iae    schedule 12.10.2015    source источник


Ответы (2)


Итак, согласно этому и this, есть несколько способов вызова rake-задач с аргументами:

Rake.application.invoke_task("my_task[arguments]")

or

Rake::Task["my_task"].invoke(arguments)

С другой стороны, я вызывал задачу как:

Rake::Task["my_task[arguments]"].invoke

Это было неправильной комбинацией двух вышеуказанных методов.

Большой thank you Джейсону за его вклад и предложение.

person x6iae    schedule 13.10.2015

На мой взгляд, рейк-задачи не должны делать что-то, они должны только вызывать что-то. Я никогда не пишу спецификации для своих рейк-задач, только то, что они вызывают.

Поскольку ваша задача rake выглядит однострочной (как и должно быть, IMO), я бы не стал писать для нее спецификацию. Если бы это было более одной строки, я бы переместил этот код в другое место, чтобы сделать его однострочным.

Но если вы настаиваете на написании спецификации, попробуйте следующее: Rake::Task["'retry:message[5]'"].invoke (добавлены одинарные кавычки).

person Jason Swett    schedule 12.10.2015
comment
› задачи rake не должны что-то делать, они должны только вызывать вещи. Я никогда не пишу спецификации для своих рейк-задач, только то, что они вызывают. +1 - person ocodo; 20.10.2016