So based on my understanding, I beleive when you do
Resque.inline = Rails.env.test?
Your resque tasks will run synchronously. I am writing a test on resque task that gets enqueue during an after_commit
callback.
after_commit :enqueue_several_jobs
#class PingsEvent < ActiveRecord::Base
...
def enqueue_several_jobs
Resque.enqueue(PingFacebook, self.id)
Resque.enqueue(PingTwitter, self.id)
Resque.enqueue(PingPinterest, self.id)
end
In the .perform
methd of my Resque task class, I am doing a Rails.logger.info
and in my test, I am doing something like
..
Rails.logger.should_receive(:info).with("PingFacebook sent with id #{dummy_event.id}")
PingsEvent.create(params)
And I have the same test for PingTwitter
and PingPinterest
.
I am getting failure on the 2nd and third expectation because it seems like the tests actually finish before all the resque jobs get run. Only the first test actually passes. RSpec then throws a MockExpectationError
telling me that Rails.logger
did not receive .info
for the other two tests. Anyone has had experience with this before?
EDIT
Someone mentioned that should_receive
acts like a mock
and that I should do .exactly(n).times
instead. Sorry for not making this clear earlier, but I have my expectations in different it
blocks and I don't think a should_receive
in one it
block will mock it for the next it
block? Let me know if i'm wrong about this.