Andy Henson
2009-May-12 16:59 UTC
[rspec-users] [RSpec] problems with a rails controller spec using AASM
Hi All,
I''m trying to spec out a Rails controller and I''m coming up
with a bit
of a problem. I''m pretty sure it''s something fairly simple but
I can
no longer see the wood for the trees.
I have a Jobs controller that looks like this (this is just the action
with the problem for brevity)
class JobsController < ApplicationController
before_filter :require_user
def accept
@job = Job.find_by_jobno(params[:id])
unless @job.accepted?
@job.accept!
add_message "Job accepted"
else
add_message "Job already accepted"
end
redirect_to(job_path(@job.jobno))
end
end
And here''s the relevant part of the specs:
describe "when accessed through a browser" do
before(:each) do
@claim = Claim.make()
@inspector = Inspector.make(:inspector)
@job = Job.make(:jobno => 1)
controller.stub!(:current_user).and_return(@inspector)
controller.stub!(:login_required).and_return(true)
end
describe "when accepting a job" do
it "should find the job" do
Job.should_receive(:find_by_jobno).with("1").and_return(@job)
do_accept
end
it "should redirect to the job page" do
do_accept
response.should redirect_to(job_path(@job.foxpro_jobno))
end
describe "if it''s already accepted" do
before(:each) do
@job.status = "accepted"
@job.save
end
it "should add a flash message" do
do_accept
flash[:message].should == "Job already accepted"
end
it "should not change the job status" do
do_accept
@job.status.should == "accepted"
end
end
describe "if it has yet to be accepted" do
it "should accept the job" do
@job.should_receive(:accept!)
do_accept
end
it "should add a flash message" do
do_accept
flash[:message].should == "Job accepted"
end
it "should change the status" do
do_accept
@job.status.should == "accepted"
end
end
def do_accept
get_with @inspector, :accept, :id => 1
end
end
end
Some info: RSpec 1.2.6. It''s a restful controller with the accept
method being an additional member. I''m using Machinist to create the
objects in the database and I''m using Rubyist''s AASM for state
changes. The default state for a new Job is "unaccepted".
When I run the code through the browser it all works as I would expect
but when I run the specs I get the following failures, all other specs
pass:
Spec::Mocks::MockExpectationError in ''JobsController when accessed
through a browser when accepting a job if it has yet to be accepted
should accept the job''
#<Job:0x398a988> expected :accept! with (any args) once, but received it 0
times
And
''JobsController when accessed through a browser when accepting a job
if it has yet to be accepted should change the status'' FAILED
expected: "accepted",
got: "unaccepted" (using ==)
Any help would be much appreciated.
Thanks,
Andy
Matt Wynne
2009-May-12 17:31 UTC
[rspec-users] [RSpec] problems with a rails controller spec using AASM
On 12 May 2009, at 17:59, Andy Henson wrote:> Job.find_by_jobno(needs to be stubbed all the time to return your job, or at least in the examples that are failing. Matt Wynne http://blog.mattwynne.net http://www.songkick.com
Andy Henson
2009-May-12 17:41 UTC
[rspec-users] [RSpec] problems with a rails controller spec using AASM
Hi Matt, You''re a star! That was exactly it. I guess I should start pair programming :) Thanks 2009/5/12 Matt Wynne <matt at mattwynne.net>:> > On 12 May 2009, at 17:59, Andy Henson wrote: > >> Job.find_by_jobno( > > needs to be stubbed all the time to return your job, or at least in the > examples that are failing. > > Matt Wynne > http://blog.mattwynne.net > http://www.songkick.com > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >