我有一个create操作,如果成功保存记录,它将调用ActiveJob。
def create
@object = Object.new(importer_params)
respond_to do |format|
if @object.save
MyJob.perform_later( @object.id )
format.html { redirect_to @object, notice: t('.notice') }
else
format.html { render :new }
end
end
end
我想测试在控制器规范中是否正确调用了作业。
describe "POST #create" do
it {
expect {
post :create, { object: valid_attributes }
}.to change(Object, :count).by(1)
}
it {
expect {
post :create, { object: valid_attributes }
}.to have_enqueued_job(MyJob)
}
end
但我明白
Failure/Error:
expect {
post :create, { object: valid_attributes }
}.to have_enqueued_job(MyJob)
expected to enqueue exactly 1 jobs, but enqueued 0
第一个测试通过了,所以我知道Object保存成功了。测试ActiveJob是否排队的正确方法是什么?
4条答案
按热度按时间9wbgstp71#
如果需要检查作业是否已多次排队,现在可以执行this:
aurhwmvo2#
我总是查看
ActiveJob::Base.queue_adapter.enqueued_jobs
的大小来测试是否调用了作业。您应该确保在每个规范之后将enqueued_jobs设置为空数组,以避免任何意外行为。
ma8fv8wu3#
在官方文档中,这里是have_enqueued_job matcher
have_enqueued_job(也称为enqueue_job)匹配器用于检查给定的ActiveJob作业是否已入队。
https://relishapp.com/rspec/rspec-rails/docs/matchers/have-enqueued-job-matcher
wxclj1h54#
我们可以使用perform_enqueued_jobs方法来等待作业完成