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 -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081125/774f7960/attachment-0001.html>
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 :( David Parker http://davidwparker.com On Tue, Nov 25, 2008 at 9:07 PM, David Parker <davidwparker at gmail.com>wrote:> 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 >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081125/a66b2e81/attachment.html>
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) -- Posted via http://www.ruby-forum.com/.
On 2008-11-25, at 22:07, David Parker wrote:> 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 ParkerHi 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: http://www.ruby-forum.com/topic/171076 I hope that helps. Cheers, Nick
Nick Hoffman 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: > http://www.ruby-forum.com/topic/171076 > > I hope that helps. Cheers, > NickThat''s actually really helpful. Thanks Nick. -- Posted via http://www.ruby-forum.com/.