On Dec 16, 2007 11:03 AM, Jonathan Linowes <[EMAIL PROTECTED]> wrote:
>
> btw, to answer the same question for member actions (such as show), you can
> stub or assert the association proxy class
>
> @article = current_user.articles.find(params[:id])
>
> then,
>
> it "should find article scoped by current_user" do
> article = mock_model(Article)
> current_user.should_receive(:articles).and_return(Article)
> Article.should_receive(:find).and_return(article)
> get :show, :id => article.id
> end
>
> this will ensure that your controller is not calling Article.find unscoped
I tend to take this one more step. I'm a bit of a demeter zealot, and
I'm also usually writing the examples from the code first. So I'd do
something like:
it "should find the current users articles" do
article = mock_model(Article)
current_user.should_receive(:find_article).with("1").and_return(Article)
get :show, :id => "1"
end
This would lead me to add a find_article method to User:
describe User do
it "should find it's own articles" do
user = User.new
user.articles.should_receive(:find).with("1")
user.find_article("1)
end
end
This has two benefits:
- each example is simpler and focuses on one object and how it behaves
- I can change the relationship between a User and it's Articles
without changing the controller code.
FWIW,
David
>
> linoj
>
>
>
>
> On Dec 3, 2007, at 5:44 AM, Daniel N wrote:
> Assuming that there is a call like this in your controller
>
> @articles = current_user.articles
>
> One way to do this is to stub out the controller.current_user to return a
> mock object of the current_user
>
> Then put an expectation on the current user that it's articles method gets
> called. (return a mocked collection of articles)
>
> Then check that @articles is set to the returned mocked collection of
> articles from current_user.articles
>
> phew...
>
> Ok So one way you might write this could be (This is untested...)
>
> it "should scope the articles to the currrent_user" do
>
> user = mock_model(User)
> articles = [mock_model(Article)]
>
> controller.stub!(:current_user).and_return(user)
> user.should_receive (:articles).and_return(articles)
>
> get :index
>
> assigns[:articles].should == articles
>
> end
>
>
> Like I said though, that's not tested itself. If that's not exactly
> right... it's along the right track of an option that can work.
>
> HTH
> Daniel
>
> On Dec 3, 2007 9:07 PM, Stefan Magnus Landrø <[EMAIL PROTECTED]>
> wrote:
> > Typically, I'd write a method in your user model that returns the user's
> articles:
> >
> > class User do
> >
> > def find_articles_for_user
> > Article.find(:all, :conditions => ['userid = ?', id)
> > end
> >
> > end
> >
> > Then you'd use a mock in your controller spec, and make sure you test that
> your method is being called.
> >
> > On the other hand, the user model should be tested directly against the
> db.
> >
> > HTH,
> >
> > Stefan
> >
> >
> > 2007/12/3, Fischer, Daniel <[EMAIL PROTECTED]>:
> > >
> > >
> > >
> > > Let's say you're using the restful_authentication plugin.
> > >
> > >
> > > You have a model called articles. On the index action of the
> articlescontroller you simply want to spec out that it'll scope the results
> to the ownership of the current_user.
> > >
> > >
> > > It should NOT include any articles other than the articles that user
> owns.
> > >
> > >
> > > How would you properly spec this out?
> > >
> > >
> > > Thanks for the help!
> > > _______________________________________________
> > > rspec-users mailing list
> > > [email protected]
> > > http://rubyforge.org/mailman/listinfo/rspec-users
> > >
> >
> >
> >
> > --
> > Bekk Open Source
> > http://boss.bekk.no
> > _______________________________________________
> > 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
>
> _______________________________________________
> 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