Search code examples
ruby-on-railsresque

Resque Errors on background job tests


Does anyone know of a guide to help me understand how to write tests for background jobs done with Resque?

These are the errors that I'm getting:

PortfoliosControllerTest#test_html_destroy_test:
NoMethodError: undefined method `id' for nil:NilClass
    test/standard_controller_tests.rb:354:in `block in do_html_destroy'
    test/standard_controller_tests.rb:353:in `do_html_destroy'
    test/standard_controller_tests.rb:38:in `block (2 levels) in `standard_controller_tests'`

Error:
DCollectionPagesControllerTest#test_html_destroy_test:
ArgumentError: wrong number of arguments (given 2, expected 1)
    app/background_jobs/destroy_portal_job.rb:4:in `perform'
    test/standard_controller_tests.rb:360:in `do_html_destroy'
    test/standard_controller_tests.rb:38:in `block (2 levels) in standard_controller_tests'

In my controller, I have:

def destroy
portal_slug = params[:id]
portal = Portal.find_by_slug(portal_slug)
@portal = Portal.find(portal_slug)
update_history(@portal)

# set delete duties to resque
if @portal.destroy!
  Resque.enqueue(DestroyPortalJob, @portal.id)

  flash[:notice] = 'Portal deleted successfully.'
  redirect_to action: :archive_index

  update_history(portal)

elsif @portal == nil
  flash[:notice] = 'That portal does not exist'
  redirect_to action: :archive_index

  end
end

Then this is my background job:

class DestroyPortalJob < BackgroundJobBase
  @queue = :destroy

  def self.perform(portal_id)
    super do
      interesting_collections.each do |collection|
        if klass = collection.singularize.camelize.try(:safe_constantize)
          klass.where(portal_id: portal_id).each do |object|
            begin
            @portal.destroy!
          rescue => e
            puts "Failed destroy!"
          end
          end
          @portal.destroy!
          puts "Delete!"
        end
      end
    end
  end
end

And then, on my test this is what I have:

def destroy
portal_slug = params[:id]
portal = Portal.find_by_slug(portal_slug)
@portal = Portal.find(portal_slug)
update_history(@portal)

# set delete duties to resque
if @portal.destroy!
  Resque.enqueue(DestroyPortalJob, @portal.id)

  flash[:notice] = 'Portal deleted successfully.'
  redirect_to action: :archive_index

  update_history(portal)

elsif @portal == nil
  flash[:notice] = 'That portal does not exist'
  redirect_to action: :archive_index
  end
 end

Any help or advice will be greatly appreciated!


Solution

  • Go through this, this what resque also recommends:

    https://github.com/resque/resque/wiki/RSpec-and-Resque