【问题标题】:testing rake tasks with Rspec is not accepting arguments使用 Rspec 测试 rake 任务不接受参数
【发布时间】:2015-10-13 22:18:43
【问题描述】:

根据this post by Stephen Hagemann,我正在尝试为我的一项 rake 任务编写 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 任务的方式有什么问题?

感谢大家的帮助。

【问题讨论】:

    标签: ruby-on-rails ruby rspec rake rake-task


    【解决方案1】:

    所以,根据thisthis,下面是一些带参数调用rake任务的方法:

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

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

    另一方面,我将任务称为:

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

    这是上述两种方法的错误组合。

    感谢 Jason 的贡献和建议,thank you

    【讨论】:

      【解决方案2】:

      在我看来,rake 任务不应该事情,它们应该只调用事情。我从不为我的 rake 任务编写规范,只写他们调用的规范。

      由于您的 rake 任务似乎是单行的(因为 rake 任务应该是,IMO),所以我不会为它编写规范。如果它不止一行,我会将该代码移到其他地方以使其成为单行。

      但如果您坚持编写规范,不妨试试这个:Rake::Task["'retry:message[5]'"].invoke(添加单引号)。

      【讨论】:

      • > rake 任务不应该做事情,他们应该只调用事情。我从不为我的 rake 任务写规范,只写他们调用的东西。 +1
      猜你喜欢
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      • 2017-09-24
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多