Rails associations

Hello!

So I’m having some problems working out some probably really easy
associations in Rails. I’ve Googled around and read some things on
different Rails forums and blogs, but I just haven’t seen many solid
examples.

Anyway, my question is a basic “how do I use RSpec with stubs/mocks
through
associations for methods”…
perhaps code would be more clear. Here’s my controller:

def create
@article = current_account.article.create(params[:article])
respond_to do |format|
if @article.save
flash[:success] = ‘Article was successfully saved.’
format.html { redirect_to(accounts_article_path(@article)) }
else
format.html { render :action => “new” }
end
end
end

And here is my corresponding spec:

describe “handling POST /accounts/articles” do
before(:each) do
@article = mock_model(Article, :to_param => ‘1’)
@account = mock_model(Account)
controller.stub!(:current_account).and_return(@account)
@account.stub!(:articles).and_return(@article)
@article.should_receive(:create)
end

describe "with successful save" do
  def do_post
    @article.should_receive(:save).and_return(true)
    post :create, :article => {}
  end

  it "should redirect to the new article" do
    do_post
    response.should redirect_to(accounts_article_url(@article))
  end
end

describe "with failed save" do
  def do_post
    @article.should_receive(:save).and_return(false)
    post :create, :article => {}
  end

  it "should re-render 'new'" do
    do_post
    response.should render_template('new')
  end
end

end

I’m getting a couple of errors from this and I can’t tell why. I have
something similar done for non-associated models with no problem.
NoMethodError in ‘Accounts::ArticlesController handling POST
/accounts/articles with failed save should re-render ‘new’’
You have a nil object when you didn’t expect it!

I’m sure that speccing associations can’t be that bad… I just don’t
really
know what to look for.

Dave, I can’t wait for your book to come out!

Thanks for the help!

David Parker

So playing around with things, it appears I didn’t remember to put in
the
and_return(@article)… so I changed my before to look something like
this:

describe “handling POST /accounts/article” do
before(:each) do
@article = mock_model(Article, :to_param => ‘1’)
@account = mock_model(Account)
controller.stub!(:current_account).and_return(@account)
@account.stub!(:articles).and_return(@article)
Article.stub!(:new).and_return(@article)
@article.should_receive(:new).and_return(@article)
end

Now, I still don’t entirely understand what I’m doing, so if someone can
explain it or point me to a good blog article, I’d greatly appreciate
it.
Like I said before though, I’ve looked around and read over the
documentation several times, but for some reason, my mind just isn’t
grasping the associations :frowning:

David Parker

On 2008-11-25, at 22:07, David Parker wrote:

end
end
end
response.should render_template(‘new’)
I’m sure that speccing associations can’t be that bad… I just
don’t really know what to look for.

Dave, I can’t wait for your book to come out!

Thanks for the help!

David Parker

Hi David. To write specs for ActiveRecord associations, I find Matthew
Heidemann’s #stub_association! extremely helpful. There was a
discussion about it last week, actually:
Mocking and stubbing model relationships - RSpec - Ruby-Forum

I hope that helps. Cheers,
Nick

Nick H. wrote:

Hi David. To write specs for ActiveRecord associations, I find Matthew
Heidemann’s #stub_association! extremely helpful. There was a
discussion about it last week, actually:
Mocking and stubbing model relationships - RSpec - Ruby-Forum

I hope that helps. Cheers,
Nick

That’s actually really helpful. Thanks Nick.

hi Parker, maybe it is not an association mock problem. I view your code
and I think you need to correct one place

@account.stub!(:articles).and_return(@article)

#=>

@account.stub!(:article).and_return(@article)