How to check what is queued in ActiveJob using Rspec

后端 未结 7 1223
感动是毒
感动是毒 2021-01-31 08:33

I\'m working on a reset_password method in a Rails API app. When this endpoint is hit, an ActiveJob is queued that will fire off a request to Mandrill (our transactional email c

7条回答
  •  余生分开走
    2021-01-31 08:50

    In a unit test, instead of checking what is queued one can also rely on ActiveJob working properly and just verify that it will be called by mocking its api.

     expect(MyJob).to receive(:perform_later).once 
     post :reset_password, user: { email: user.email }
    

    The creators of the ActiveJob have used the same techniques for their unit tests. See GridJob Testobject

    They create a testmock GridJob in their tests and override the perform method, so that it only adds jobs to a custom Array, they call JobBuffer. At the end they test, whether the buffer has jobs enqueued

    At a single place one can ofc also do an integrations test. The ActiveJob test_helper.rb is supposed to be used with minitest not with rspec. So you have to rebuild it's functionalitity. You can just call

    expect(ActiveJob::Base.queue_adapter.enqueued_jobs).to eq 1
    

    without requiring anything

    Update 1: As noticed within a comment. ActiveJob::Base.queue_adapter.enqueued_jobs works only by setting it the queue_adapter into test mode.

    # either within config/environment/test.rb
    config.active_job.queue_adapter = :test
    
    # or within a test setup
    ActiveJob::Base.queue_adapter = :test
    

提交回复
热议问题