2015-10-12 4 views
3

Я пытаюсь написать тест Rspec для одной из моих задач рейка, согласно this post by Stephen Hagemann.проверка задач рейка с помощью 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 

Я могу получить вызов рейка, но тест не работает, поскольку нет message_id.

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

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

ответ

4

Так, согласно this и this, следующие несколько способов вызова задаче рек с аргументами:

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

или

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

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

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

Которая была Mis-комбинацией вышеуказанного два метода.

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

4

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

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

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

+2

> рейк-задачи не должны делать ничего, они должны только называть вещи. Я никогда не пишу спецификации для своих рейк-задач, только то, что они называют. +1 – ocodo