Может ли Rspec ждать ответа от ApplicationJob? - PullRequest
2 голосов
/ 30 октября 2019

Я изучаю RSpec и вызываю метод внутри модели из файла спецификации, но у метода есть фоновая работа, мои вопросы таковы;Как я могу настроить спецификацию на ожидание ответа от фоновой работы? Возможно ли это?

Спасибо за помощь !!!!

Мой файл 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

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Если вы используете Sidekiq, объявите Sidekiq::Testing.inline! в своем тесте или в блоке before.

0 голосов
/ 30 октября 2019

Я решил следующим образом:

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
...