我有个很简单的帮手,我不知道为什么不起作用。我想可能是因为规格。
worker
class AdminPanelLogRemoverWorker
include Sidekiq::Worker
def perform
expired_logs = AdminPanelLog.where('created_at > ?', 1.year.ago)
expired_logs.delete_all
end
endspecs
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
endadmin_panel_log1和admin_panel_log2是对应的模型AdminPanelLog,它的形式正确(也许我应该避免let! ?)。结果,规范失败,出现错误。
失败/错误: expect(AdminPanelLog.count).to eq(1)预期:1 got: 0(使用==进行比较)
发布于 2019-09-13 08:31:35
我刚刚用
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 },因为主题本身将保存当前类的值。
发布于 2019-09-13 14:20:24
正如Aarthi回答中已经显示的那样,问题是您没有调用subject,所以代码没有被执行,您的工作人员也没有被调用。尽管如此,我还是会通过以下几点改进答案
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上面的测试允许您检查工人是否确实完成了删除内容的工作。
https://stackoverflow.com/questions/57919456
复制相似问题