ruby 使用Rspec测试rake任务不接受参数

z0qdvdin  于 2023-06-22  发布在  Ruby
关注(0)|答案(3)|浏览(90)

根据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任务的方式有什么问题吗?
谢谢你的帮助。

tv6aics1

tv6aics11#

因此,根据thisthis,以下是一些使用参数调用rake任务的方法:

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

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

另一方面,我把这个任务称为:

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

这是上述两种方法的一种结合。
一个大的thank you贾森为他的贡献和建议。

a5g8bdjr

a5g8bdjr2#

在我看来,rake任务不应该“做”事情,它们只应该“调用”事情。我从不为我的rake任务写规范,只写它们调用的东西。
因为rake任务看起来是一个单行程序(rake任务应该是,IMO),所以我不会为它编写规范。如果它不止一行,我会将代码移到其他地方,使其成为一行代码。
但是如果你坚持要写一个规范,也许可以试试这个:Rake::Task["'retry:message[5]'"].invoke(添加单引号)。

7dl7o3gd

7dl7o3gd3#

2023年更新

你可以像下面这样试试

Rake::Task['retry:message'].execute(Rake::TaskArguments.new([:message_id],['900000']))

相关问题