Search code examples
ruby-on-railssidekiqminitest

Sidekiq worker not getting queued in testing


I am using sidekiq to queue a job to validate the input of a field on a model (a link) and visit the link to make sure it doesn't return a 404 if it passes a regex validation.

If the regex validation passes and the link does not return 404 I assign another attribute to the same model but on a different field.

The worker is trigger by calling a method, the method is triggered after an after_commit, on: :update callback

The method only triggers the worker if 'previous_changes['json object I am using to make changes']' is true. This is so the worker won't continue to be called over and over again.

All of this works fine in development, confirmed with multiple use cases by QA'ing it myself

I am trying to write a test in MiniTest to ensure that a worker gets queued when the model's json field is changed but a worker is not being queued and for the life of me I can't figure out why.

I am testing the expectations for the worker being queued with:

assert_difference 'WorkerClass.jobs.size' do
  site = sites(:site_from_fixtures)
  site.attribute_that_triggers_change = { "random" => "json_object" }
  site.save
end

The test returns: "Expected: 1, Actual: 0"

Any input would be greatly appreciated!


Solution

  • This issue was fixed by installing the test_after_commit gem.

    Apparently after_commit's don't fire in tests unless you either use that gem or specify the necessary changes in a test_helper. I opted for the gem option just to keep things a little easier.