[rspec-users] [rspec] looking for a simple refresher

rupert rupert_apsc at rupespad.com
Fri Aug 17 19:54:51 EDT 2007


Not entirely sure how to go about mocking the association, but it's  
going to be something along these lines (totally untested!)....

describe TicketsController, "handling POST /tickets" do
   before do
     @ticket = mock_model(Ticket, :save => true)

     @user_tickets_association = mock("accociation")
     @user_tickets_association.stub!(:build).and_return(@ticket)

     @user = mock_model(User)
     @user.stub!(:tickets).and_return(@user_tickets_association)

     @ticket_params = {}
   end
   def do_post
     post :create, :ticket => @params, :user_id => "user_id"
   end

   it "should find the user" do
     User.should_receive(:find).with("user_id").and_return(@user)
     do_post
   end
   it "should assign the user for the view" do
     do_post
     assigns[:user].should equal(@user)
   end
   it "should build a new ticket on the user" do
     @user_tickets_association.should_receive(:build).with 
(@params).and_return(@ticket)
     do_post
   end
   it "should assign the ticket for the view" do
     do_post
     assigns[:ticket].should equal(@ticket)
   end
   it "should save the new ticket" do
     @ticket.should_receive(:save).with().and_return(true)
     do_post
   end

   it "should save the new ticket" do
     @ticket.should_receive(:save).with().and_return(true)
     do_post
   end

   it "should redirect to the ticket path if successful" do
     do_post
     response.should redirect_to('/tickets')
   end

   it "should render the new page if create fails" do
     @ticket.stub!(:save).and_return(false)
     do_post
     response.should render_template('new')
   end
end



On 18 Aug 2007, at 00:36, Andrew WC Brown wrote:

> That makes a-lot of sense. That 'new' word threw me off.
>
> My create method is slightly more complex and I'm not sure how to  
> spec it.
>
>   def create
>     @user = User.find(params[:user_id])
>     @ticket = @ user.tickets.build(params[:ticket])
>     if @ticket.save
>       redirect_to tickets_path
>     else
>       render new_usr_ticket_path(params[:user_id])
>     end
>   end
>
>
> Would I need two mock_models?
>
> On 8/17/07, rupert <rupert_apsc at rupespad.com> wrote:
> what's in the create method of the controller?? you've only given  
> the contents of the new method - and without knowing what you want  
> it to do it's hard to know what will work.
>
> Assuming it's the normal
>
> def create
>  @ticket = Ticket.new(params(:ticket])
>   if @ticket.save
>    ....etc etc
> end
>
> then something like the following should work:
>
> describe TicketsController, "handling POST /tickets" do
>   before do
>     @ticket = mock_model(Ticket, :save => true)
>     Ticket.stub!(:new).and_return(@ticket)
>     @params = {}
>   end
>
>   def do_post
>     post :create, :ticket => @params
>   end
>
>   it "should create a new ticket" do
>     ticket.should_receive(:new).with(@params).and_return(@ticket)
>     do_post
>   end
>
>   it "should assign the ticket for the view" do
>     do_post
>     assigns[:ticket].should equal(@ticket)
>   end
>
>   it "should save the new ticket" do
>     @ticket.should_receive(:save).with().and_return(true)
>     do_post
>   end
> end
>
>
> On 18 Aug 2007, at 00:11, Andrew WC Brown wrote:
>
>> I replaced:
>>
>> @ticket.should_receive (:new).with(@params).and_return(@ticket)
>>
>> with
>>
>> Ticket.should_receive(:new).with(@params).and_return(@ticket)
>>
>> Similar Error
>>
>> 1)
>> Spec::Mocks::MockExpectationError in 'TicketsController handling  
>> POST /tickets should create a new ticket'
>> Mock 'Class' expected :new with ({}) once, but received it 0 times
>> ./spec/controllers/tickets_controller_spec.rb:16:
>>
>> If I omit @params = {} then I get the error as following
>>
>> 1)
>> Spec::Mocks::MockExpectationError in 'TicketsController handling  
>> POST /tickets should create a new ticket'
>> Mock 'Class' expected :new with (any args) once, but received it 0  
>> times
>> ./spec/controllers/tickets_controller_spec.rb:16:
>>
>> So its not receiving the new method at all even though I clearly  
>> called it.
>> Could it be possible that the issue is with the actual Ticket  
>> model itself?
>>
>> On 8/17/07, David Chelimsky < dchelimsky at gmail.com > wrote:
>> On 8/17/07, Andrew WC Brown < omen.king at gmail.com > wrote:
>> > I've been off the rspec for a few months and I'm trying to get  
>> back on it.
>> >
>> > 1)
>> >  Spec::Mocks::MockExpectationError in 'TicketsController
>> > handling POST /tickets should create a new ticket'
>> >  Mock 'Ticket_1001' expected :new with ({}) once, but received  
>> it 0 times
>> >  ./spec/controllers/tickets_controller_spec.rb:16:
>> >  script/spec:4:
>> >
>> > class TicketsController < ApplicationController
>> >
>> >   def new
>> >     Ticket.new
>> >   end
>> >
>> > end
>> >
>> > describe TicketsController, "handling POST /tickets" do
>> >
>> >   before do
>> >     @ticket = mock_model(Ticket, :to_param => '1', :save => true)
>> >     Ticket.stub!(:new).and_return(@ticket)
>> >     @params = {}
>> >   end
>> >
>> >   def do_post
>> >     post :create, :ticket => @params
>> >   end
>> >
>> >   it "should create a new ticket" do
>> >
>> > @ticket.should_receive(:new).with(@params).and_return(@ticket)
>>
>> This is telling the ticket object to expect new, but it's the Ticket
>> class that will receive it:
>>
>> Ticket.should_receive(:new).with(@params).and_return(@ticket)
>>
>> That should do it.
>>
>> >     do_post
>> >   end
>> >
>> > end
>> >
>> > Would someone provide with an explanation what I have to do to  
>> make this
>> > spec pass?
>> > Peepcode hasn't released their screen cast on rspecing  
>> controllers yet ='(
>> >
>> >
>> >
>> >
>> >
>> > _______________________________________________
>> > rspec-users mailing list
>> > rspec-users at rubyforge.org
>> > http://rubyforge.org/mailman/listinfo/rspec-users
>> >
>> _______________________________________________
>> rspec-users mailing list
>> rspec-users at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/rspec-users
>>
>>
>>
>> -- 
>> Monsterbox Productions
>> putting small businesses on-line
>>
>> 1319 Victoria Avenue East
>> Thunder Bay, Ontario P7C 1C3
>> Canada
>>
>> Andrew WC Brown
>> web-developer and owner
>> andrew at monsterboxpro.com
>> P: 807-626-9009
>> F: 807-624-2705
>> _______________________________________________
>> rspec-users mailing list
>> rspec-users at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/rspec-users
>
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>
>
>
> -- 
> Monsterbox Productions
> putting small businesses on-line
>
> 1319 Victoria Avenue East
> Thunder Bay, Ontario P7C 1C3
> Canada
>
> Andrew WC Brown
> web-developer and owner
> andrew at monsterboxpro.com
> P: 807-626-9009
> F: 807-624-2705
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://rubyforge.org/pipermail/rspec-users/attachments/20070818/ba347153/attachment-0001.html 


More information about the rspec-users mailing list