【问题标题】:Test Sidekiq job that changes value of object测试改变对象值的 Sidekiq 作业
【发布时间】:2014-07-09 03:22:44
【问题描述】:

我有以下控制器:

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

发生的情况是,正在调用的 perform 方法不是定义的方法。我试过做p 'hello worlds',但它没有显示在那里。

【问题讨论】:

  • 您应该只测试perform 方法,以及使用您的ID 调用方法OrderProcessorWorker.perform_async 的事实。其他东西已经测试过了,因为它具有 gem 功能。

标签: ruby-on-rails ruby rspec sidekiq


【解决方案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

【讨论】:

  • 但是当我测试 create 方法时,我应该存根这个:OrderProcessorWorker.perform_async(@order.id) 换句话说,如果你正在做一个完整的功能测试,你如何处理异步作业? ?
  • 或者更好 - expect(OrderProcessorWorker).to receive(:perform_async).with((@order.id)
  • 这是什么意思?我会把这种期望放在哪里?在测试 create 方法时?
  • 是的 - 如果不调用 perform_async,它将无法通过测试 (relishapp.com/rspec/rspec-mocks/v/2-13/docs/…)
  • 但理想情况下我需要模拟该调用,对吗?因为我测试的是 create 方法,而不是 worker 本身。
【解决方案2】:

如果你在测试create:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2013-10-30
    • 2016-05-29
    • 2017-10-20
    相关资源
    最近更新 更多