RSpec + Sidekiq: NoMethodError: MyImportJob 'jobs'未定义方法



我正在尝试在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_asyncjobs.

要解决您的问题,请按如下方式明确定义它:

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

同样的原因。这是工人类上的一种方法。

最新更新