Git Product home page Git Product logo

resque_unit's Introduction

ResqueUnit

ResqueUnit provides some extra assertions and a mock Resque for testing Rails code that depends on Resque. You can install it as either a gem or a plugin:

gem install resque_unit

and in your test.rb:

config.gem 'resque_unit'

If you'd rather install it as a plugin, you should be able to run

script/plugin install git://github.com/justinweiss/resque_unit.git

inside your Rails projects.

Examples

ResqueUnit provides some extra assertions for your unit tests. For example, if you have code that queues a resque job:

class MyJob
  @queue = :low  

  def self.perform(x)
    # do stuff
  end
end

def queue_job
  Resque.enqueue(MyJob, 1)
end

You can write a unit test for code that queues this job:

def test_job_queued
  queue_job
  assert_queued(MyJob) # assert that MyJob was queued in the :low queue
end

You can also verify that a job was queued with arguments:

def test_job_queued_with_arguments
  queue_job
  assert_queued(MyJob, [1])
end

And you can run all the jobs in the queue, so you can verify that they run correctly:

def test_job_runs 
  queue_job 
  Resque.run!
  assert stuff_was_done, "Job didn't run"
end

You can also access the queues directly:

def test_jobs_in_queue
  queue_job 
  assert_equal 1, Resque.queue(:low).length
end

You can test enqueueing to specific queues for class constants that don't exist in your project:

def test_job_in_another_queue
  Resque.enqueue_to(:another_queue, "NonexistantJobClass", "some args")
  assert_queued_to(:another_queue, "NonexistantJobClass", "some args")
end

And assert the opposite

def test_job_not_enqueued
  Resque.enqueue_to(:another_queue, "NonexistantJobClass", "some args")
  refute_queued_to(:wrong_queue, "NonexistantJobClass", "some args")
end

Finally, you can enable hooks:

Resque.enable_hooks!

class MyJobWithHooks
  @queue = :hooked

  def self.perform(x)
    # do stuff
  end

  def self.after_enqueue_mark(*args)
    # called when the job is enqueued
  end

  def self.before_perform_mark(*args)
    # called just before the +perform+ method
  end

  def self.after_perform_mark(*args)
    # called just after the +perform+ method
  end

  def self.failure_perform_mark(*args)
    # called if the +perform+ method raised
  end

end

def queue_job
  Resque.enqueue(MyJobWithHooks, 1)
end

Caveats

  • You should make sure that you call Resque.reset! in your test's setup method to clear all of the test queues.
  • Hooks support is optional. Just because you probably don't want to call them during unit tests if they play with a DB. Call Resque.enable_hooks! in your tests's setup method to enable hooks. To disable hooks, call Resque.disable_hooks!.

Resque-Scheduler Support

By calling require 'resque_unit_scheduler', ResqueUnit will provide mocks for resque-scheduler's enqueue_at and enqueue_in methods, along with a few extra assertions. These are used like this:

Resque.enqueue_in(600, MediumPriorityJob) # enqueues MediumPriorityJob in 600 seconds
assert_queued_in(600, MediumPriorityJob) # will pass
assert_not_queued_in(300, MediumPriorityJob) # will also pass

Resque.enqueue_at(Time.now + 10, MediumPriorityJob) # enqueues MediumPriorityJob at 10 seconds from now
assert_queued_at(Time.now + 10, MediumPriorityJob) # will pass
assert_not_queued_at(Time.now + 1, MediumPriorityJob) # will also pass

Resque.enqueue_in_with_queue(:another_queue, 600, "NonexistantJobClass")
assert_queued_in_with_queue(:another_queue, 600, "NonexistantJobClass") # will pass

Resque.enqueue_at_with_queue(:another_queue, Time.now + 10, "NonexistantJobClass") # enqueues MediumPriorityJob at 10 seconds from now
assert_queued_at_with_queue(:another_queue, Time.now + 10, "NonexistantJobClass") # will pass

For now, assert_queued and assert_not_queued will pass for any scheduled job. Resque.run! will run all scheduled jobs as well.

Copyright (c) 2010 Justin Weiss, released under the MIT license

resque_unit's People

Contributors

justinweiss avatar stephencelis avatar yaauie avatar madadam avatar indrekj avatar chingor13 avatar tekin avatar bvandenbos avatar davetapley avatar jasondew avatar ndmarcel avatar mdimas avatar mikz avatar nfo avatar rubiii avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.