我正在学习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
在测试中或在Sidekiq::Testing.inline!
块中声明before
。
我以这种方式解决:
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