x6i*_*iae 5 ruby rake rspec ruby-on-rails rake-task
根据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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此测试时,我收到以下错误:
Don't know how to build task 'retry:message[5]'
Run Code Online (Sandbox Code Playgroud)
另一方面,当我运行没有参数的任务时:
Rake::Task["retry:message"].invoke
Run Code Online (Sandbox Code Playgroud)
我能够调用rake任务,但测试失败,因为没有message_id.
我将参数传递给rake任务的方式有什么问题?
谢谢你的帮助.
在我看来,rake任务不应该做的事情,他们应该只调用事物.我从不为我的rake任务编写规范,只写他们调用的东西.
由于你的rake任务似乎是一个单行(因为rake任务应该是,IMO),我不会为它编写规范.如果它不止一行,我会将该代码移到其他地方,使其成为一行.
但如果你坚持写一个规范,也许试试这个:( Rake::Task["'retry:message[5]'"].invoke添加单引号).
因此,根据这一点和以下,以下是使用参数调用rake任务的一些方法:
Rake.application.invoke_task("my_task[arguments]")
Run Code Online (Sandbox Code Playgroud)
要么
Rake::Task["my_task"].invoke(arguments)
Run Code Online (Sandbox Code Playgroud)
另一方面,我把任务称为:
Rake::Task["my_task[arguments]"].invoke
Run Code Online (Sandbox Code Playgroud)
这是上述两种方法的Mis组合.
一个大thank you杰森对他的贡献和建议.
| 归档时间: |
|
| 查看次数: |
2128 次 |
| 最近记录: |