测试改变对象值的Sidekiq作业

时间:2014-05-20 18:11:22

标签: ruby-on-rails ruby rspec sidekiq

我有以下控制器:

def create
 @order = Order.create(order_params)
 OrderProcessorWorker.perform_async(@order.id)
end

以下工人:

def perform(order_id)
  #.. some logic
  @order.status = 'processed'
  @order.save

  #.. some other logic
end

我的问题是......测试作业正在改变订单状态的正确方法是什么?这个gem https://github.com/philostler/rspec-sidekiq有助于测试作业是否排队,延迟,重试......等等。但是你如何测试工作实际上在做什么?

编辑:这就是我所做的:

describe OrderProcessorWorker do
  describe '#perform' do
    context 'an order without any pages' do
      it 'changes the status of the order to missing_pages' do
        FactoryGirl.create(:order_processing_status)
        p OrderProcessingStatus.all # => This shows the just created order_processing_status
        order = FactoryGirl.create(:order)
        subject.perform(order.id)
      end
    end
  end
end

发生的情况是,被调用的执行方法不是定义的方法。我尝试过做p 'hello worlds'并且没有在那里显示。

2 个答案:

答案 0 :(得分:1)

要测试您的员工是否正在执行您打算执行的工作 - 请测试perform而不是perform_async

describe OrderProcessorWorker do

  it 'changes order status' do
    subject.perform(order_id)

    expect(Order.find(id: order_id).status).to eq 'processed'
  end
end

答案 1 :(得分:1)

如果您正在测试create

assert_equal 0, OrderProcessorWorker.jobs.size
post :create, ...
assert_equal 1, OrderProcessorWorker.jobs.size