Should_receive test unexpectedly failing

I’m unsure why this test is still failing. I’ve tested it in console
and the code works as expected. Is there something wrong with how I
have my test written?

****************** error

  1. Job selecting the next job to be processed should lock the next job
    Failure/Error: job.should_receive(:update_attribute).with(:locked,
    true)
    (#Job:0x105496488).update_attribute(:locked, true)
    expected: 1 time
    received: 0 times

****************** job_spec.rb

it "should lock the next job" do
 job = Factory(:job, :locked => false)
 job.should_receive(:update_attribute).with(:locked, true)
 Job.next
end

****************** job.rb

def self.next
  job = incomplete.unlocked.prioritized.limit(1).first
  job.lock! if job
  job
end

def lock!
update_attribute(:locked, true)
end

def unlock!
update_attribute(:locked, false)
end

On Jul 22, 2010, at 10:48 AM, ericindc wrote:

   expected: 1 time

****************** job.rb

def self.next
job = incomplete.unlocked.prioritized.limit(1).first

This job object is not the same object as the on in the spec. To get
this to work, you’d have to stub like so:

Job.stub_chain(:incomplete, :unlocked, :prioritized,
:limit).and_return(job)

Personally, I wouldn’t bother, especially since you’re using a real db
backed object anyhow (Factory(:job …)). I’d just write the spec like
this:

job = Factory(:job, :locked => false)
job.next
job.should_not be_locked

Much cleaner and to the point, and less invasive (and therefore less
brittle).

HTH,
David

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs