Rspec可以等待ApplicationJob的答复吗?

问题描述 投票:2回答:2

我正在学习RSpec,并且正在从spec文件中调用模型内部的方法,但是该方法有后台工作,我的问题是;如何设置规格以等待背景工作的响应?有可能吗?

感谢您的帮助!!!!

我的Rspec文件:user_spec.rb

require 'rails_helper'
RSpec.describe User, type: :model do
  let(:user) { user.create(name: "Test User Name",last_name: "") }
  describe "existing user instance" do
    it "fetch last name" do
      user.update_last_name!
      expect(user.last_name).to eq("Test Last Name")
    end
  end
end

我的模型文件:user.rb

class User < ApplicationRecord

  def update_last_name!
    UpdateLastNameJob.perform_later(self.id,"Test Last Name")
  end

end

我在Reddis中工作的后台作业:update_last_name_job.rb

class UpdateLastNameJob < ApplicationJob
  @queue = :default
  def perform(user_id,last_name)
    @user = User.find(user_id)
    @user.last_name = last_name
    @user.save
  end
end
ruby-on-rails ruby redis ruby-on-rails-5 rspec-rails
2个回答
1
投票

在测试中或在Sidekiq::Testing.inline!块中声明before


0
投票

我以这种方式解决:

require 'rails_helper'
RSpec.describe User, type: :model do

  include ActiveJob::TestHelper

  let(:user) { user.create(name: "Test User Name",last_name: "") }


  describe "existing user instance" do
    it "fetch last name" do
      user.update_last_name!
      # update_last_name! is calling a background job, so the result will not be ready yet.
      expect(user.last_name).to eq("")
      # This line is goint to execute the backgound job
      perform_enqueued_jobs
      # Models reload with new data
      user.reload
      # Will work!
      expect(user.last_name).to eq("Test Last Name")
    end
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.