Simple testing of Sidekiq jobs via a collection of matchers and common tasks
RubyGems | Code Climate | GitHub | Travis CI | Coveralls | Gemnasium | RubyDoc | Ruby Toolbox
# Gemfile
group :test do
gem "rspec-sidekiq"
end
rspec-sidekiq
requires sidekiq/testing
by default so there is no need to include the line require "sidekiq/testing"
inside your spec_helper.rb
.
This has the effect of not pushing enqueued jobs to Redis but to a job
array to enable testing (see Sidekiq's testing wiki). Thus, only include gem "rspec-sidekiq"
in environments where this behaviour is required, such as the test
group.
If you are using Sidekiq Batches (Sidekiq Pro feature), rspec-sidekiq
replaces the implementation (using the NullObject pattern) enabling testing without a Redis instance. Mocha and RSpec stubbing is supported here.
If you wish to modify the default behaviour, add the following to your spec_helper.rb
file
RSpec::Sidekiq.configure do |config|
# Clears all job queues before each example
config.clear_all_enqueued_jobs = false # default => true
end
Describes the queue that the job should be processed in
sidekiq_options queue: :download # job option
it { should be_processed_in :download } # one liner
expect(AwesomeJob).to be_processed_in :download # new expect syntax
Describes if the job retries when there is a failure in it's execution
sidekiq_options retry: 5 # job option
it { should be_retryable true } # one liner
expect(AwesomeJob).to be_retryable true # new expect syntax
# ...or alternatively specifiy the number of times it should be retried
it { should be_retryable 5 } # one liner
expect(AwesomeJob).to be_retryable 5 # new expect syntax
Describes if the job should be unique within it's queue
sidekiq_options unique: true # job option
it { should be_unique } # one liner
expect(AwesomeJob).to be_unique # new expect syntax
Evaluates that there is an enqueued job with the specified arguments
expect(AwesomeJob).to have_enqueued_job("Awesome", true) # new expect syntax
Evaluates the number of enqueued jobs for a specified job class
expect(AwesomeJob).to have_enqueued_jobs(1) # new expect syntax
# ...but you could just use
expect(AwesomeJob).to have(1).jobs
# ...or even
expect(AwesomeJob).to have(1).enqueued.jobs
Describes if the job was called on a class using the delay extension for sidekiq
expect("user_welcome_email").to be_a_delayed_job
# verifying the delay amount
expect("user_welcome_email").to be_a_delayed_job(1.hour)
require "spec_helper"
describe AwesomeJob do
it { should be_processed_in :download }
it { should be_retryable false }
it { should be_unique }
it "enqueues another awesome job" do
subject.perform
expect(AnotherAwesomeJob).to have_enqueued_job("Awesome", true)
end
end
bundle exec rspec spec
Please do! If there's a feature missing that you'd love to see then get in on the action!
Issues/Pull Requests/Comments bring them on...