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_log1
和 admin_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
以上测试允许您检查工作人员是否确实完成了删除内容的工作。
我有一个简单的 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_log1
和 admin_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
以上测试允许您检查工作人员是否确实完成了删除内容的工作。