[rspec-users] Attempting to Make Sense of RSpec use
raasdnil at gmail.com
Thu Jul 3 21:09:58 EDT 2008
On Fri, Jul 4, 2008 at 8:32 AM, Tiffani Ashley Bell
<tiffani2k3 at gmail.com> wrote:
> Hi everybody,
Hi Tiffany, welcome to Rspec
> I was reading the Typo source code, however, and came across some code that
> I didn't know exactly how it worked. I've noticed that in testing one of
> their controllers, they use a variable (@comments) that they don't declare
> anywhere else, yet they use it as a stand in for collections on some of the
> mocks. How is that possible? I know in the mocking documentation it says
> that you can define collaborations with other objects before those objects
> exist, but how is that working in this code? I only ask that because later,
> you see code like this: @comments.stub!(:build).and_return(@comment).
If you have a look at the descriptions, they use :shared => true.
This is a way of being DRY in RSpec (which I personally don't think is
such a good idea).
What the shared => true declaration allows you to do is to include
that block of code elsewhere with 'it should behave like my shared
So we have (describe "All Requests", :shared => true do)
and then the next description block is:
describe "General Comment Creation", :shared => true do
it_should_behave_like "All Requests"
Which then includes the All Requests block (which is just a before method).
The @comments variable gets declared in:
and then this is tied in to the Article model in the _previous_ code
block like so:
@article = mock_model(Article,
:comments => @comments,
:published_comments => @comments,
:add_comment => @comment)
So when you call @article.comments you get @comments as a stub back
which stubs :build and returns a @comment.
This is where, in RSpec, you can dig a very fast grave. Because
you'll come back to this code in 6-12 months and be totally stuck
trying to figure out what is where.
I recently wrote a viewpoint on this that might help you:
Hope you do well with Rspec, feel free to ask more questions!
Rails, RSpec, Puppet and Life blog....
More information about the rspec-users