我正在尝试在Rails 4.2.4应用程序中为RSpec + Sidekiq编写一些规范,但遇到了一些问题。
我的代码如下所示:
class MyImportJob
include Sidekiq::Worker
sidekiq_options queue: :default
def perform(params)
# Do magic
end
end
和规格:
describe MyImportJob, type: :job do
let(:panel) { create(:panel) }
describe '#perform' do
context 'unsuccessfully' do
it 'raises ArgumentError if no panel param was passed' do
expect {subject.perform_async()}.to raise_error(ArgumentError)
end
end
context 'successfully' do
it 'given a panel, it increases the job number' do
expect {
subject.perform_async(panel_id: panel.id)
}.to change(subject.jobs, :size).by(1)
end
end
end
end
但是我收到以下错误:
Failure/Error: }.to change(subject.jobs, :size).by(1)
NoMethodError:
undefined method `jobs' for #<MyImportJob:0x007f80b74c5c18>
和
Failure/Error: expect {subject.perform_async()}.to raise_error(ArgumentError)
expected ArgumentError, got #<NoMethodError: undefined method `perform_async' for #<MyImportJob:0x007f80b6d73f50>>
我相信只要我在工作人员中包含行include Sidekiq::Worker
,Sidekiq 就应该默认提供perform_async
,这是正确的吗?如果我只使用 perform
,第一个测试就会通过,但我希望它能通过perform_async
这是我在我的代码库中使用的测试。
至于第二个,我不明白为什么没有针对测试对象的方法jobs
。对此有什么线索吗?
我的rails_helper.rb
文件有:
require 'sidekiq/testing'
Sidekiq::Testing.fake!
提前感谢!
如果您没有明确定义subject
,rspec 将按照以下规则创建主题:
默认情况下,如果第一个参数指向最外层的示例组 (描述或上下文块(是一个类,RSpec 创建一个实例 该类并将其分配给主题
参考:RSpec 的主题和 let 有什么区别?什么时候应该使用它们?
这意味着它会创建您的辅助角色的实例。这样你就不能打电话给perform_async
和jobs
.
要解决您的问题,请按如下方式明确定义它:
describe MyImportJob, type: :job do
let(:panel) { create(:panel) }
subject { MyImportJob }
describe '#perform' do
context 'unsuccessfully' do
it 'raises ArgumentError if no panel param was passed' do
expect {subject.perform_async()}.to raise_error(ArgumentError)
end
end
context 'successfully' do
it 'given a panel, it increases the job number' do
expect {
subject.perform_async(panel_id: panel.id)
}.to change(subject.jobs, :size).by(1)
end
end
end
end
预期的参数错误,得到
#<NoMethodError: undefined method 'perform_async' for #<MyImportJob:0x007f80b6d73f50>>
perform_async
是工人阶级本身的一种方法。
MyImportJob.perform_async(...)
我不明白为什么没有针对测试对象的方法
jobs
同样的原因。这是工人类上的一种方法。