Rails 简单 sidekiq 删除工作失败的规范

Rails specs for simple sidekiq delete worker failling

我有一个简单的 sidekiq worker,我不知道为什么它不起作用。我想也许是因为规格。

worker

class AdminPanelLogRemoverWorker
  include Sidekiq::Worker

  def perform
    expired_logs = AdminPanelLog.where('created_at > ?', 1.year.ago)
    expired_logs.delete_all
  end
end

specs

require 'rails_helper'

describe AdminPanelLogRemoverWorker do
  include_context 'with admin_user form'

  subject { described_class.new.perform }

  let!(:admin_panel_log1) do
    create :admin_panel_log,
    action_type: 'Update',
    old_data: admin_user_form,
    created_at: 2.years.ago
  end
  let!(:admin_panel_log2) do
    create :admin_panel_log,
    old_data: admin_user_form,
    created_at: 2.days.ago
  end

  context 'when admin log is outdated' do
    it 'calls remover worker' do
      expect(AdminPanelLog.count).to eq(1)
    end
  end
end

admin_panel_log1admin_panel_log2 是相应的模型 AdminPanelLog 并且格式正确(也许我应该避免 let! ?)。结果规格因错误而失败

Failure/Error: expect(AdminPanelLog.count).to eq(1) expected: 1 got: 0 (compared using ==)

我刚刚用

测试过
RSpec.describe TestController, type: :controller do

    subject { User.new }

    let!(:test) do
      p subject
      p "dfvb"
    end

    it 'testing order of let and subject' do 
      # Spec
     end
end

subject 在调用 let! 块之前初始化。因此,在您的情况下,作业 运行 时甚至不会创建 lo AdminPanelLog。所以这个例子失败了。

context 'when the admin log is outdated' do
    it 'calls remover worker' do
      subject.new.perform #Perform the job here or after the initialization of AdminPanelLog 
      expect(AdminPanelLog.count).to eq(1)
    end
  end

并删除此 subject { described_class.new.perform },因为主题本身将保留当前 class.

的值

从 Aarthi 的回答中可以看出,问题是你没有调用 subject,所以代码没有执行,你的 worker 也没有被调用。 尽管如此,我还是会通过以下

改进答案
context 'when admin log is outdated' do
    it 'remover worker deletes them' do
      expect { subject }.to change(AdminPanelLog, :count).by(-2) #or whatever the amount is
    end
  end

以上测试允许您检查工作人员是否确实完成了删除内容的工作。