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 <[EMAIL PROTECTED]> 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 < [EMAIL PROTECTED] > wrote:
On 8/17/07, Andrew WC Brown < [EMAIL PROTECTED] > 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
> [email protected]
> http://rubyforge.org/mailman/listinfo/rspec-users
>
_______________________________________________
rspec-users mailing list
[email protected]
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
[EMAIL PROTECTED]
P: 807-626-9009
F: 807-624-2705
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users


_______________________________________________
rspec-users mailing list
[email protected]
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
[EMAIL PROTECTED]
P: 807-626-9009
F: 807-624-2705
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to