> > > Seems reasonable to me. You could test with either an interaction based
> > > approach (use mocks and stubs to confirm that @object receives the
> > > "created_by" message with the expected param) or a state based approach
> > > (hit the controller action and then inspect the system state afterwards
> > > to confirm that it is in the expected state).
>
> > What I was trying to do on my own felt a lot like what you're calling
> > an interaction based approach. I want to leave the behavior testing of
> > my app to cuke features and I'm thinking that if I'm writing a
> > controller spec, then it would probably be right to test the internals
> > of my controllers.
>
> I wouldn't say that "behavior" is only for Cucumber. Back when Cucumber
> hadn't even been imagined yet, RSpec was created as a "Behavior-Driven
> Development" library. Behavior has always been central to what we do
> with RSpec, even at the lowest levels.
>
> I think an important question to ask yourself when writing specs is
> "_Why_ am I doing this?", and that leads on to "_What_ am I interested
> in specifying here?". For me it's _all_ about behavior.

In retrospect, that's absolutely right. I think what I should have
said was I want separation of granularity in my behaviors. The model
being the most fine grained and the features being the most coarse -
with just enough overlap as to not leave any holes but not so much as
to make senseless duplication.

> The specs have two purposes, then: to document/show the behavior (when read),
> and to confirm/test the behavior (when executed). If I find myself writing
> a test that neither shows nor tests behavior, then I probably shouldn't be 
> writing it.

That's been a good barometer for me too.

> > it "should explicitly set created_by" do
> >  controller.stub(:current_user) { mock_user }
> >  mock_order.should_receive(:created_by=).with(mock_user)
> >  post :create
> > end
>
> > This is my newly working spec. Does this look well thought out or is
> > there some glaring pitfall to doing it this way?
>
> Well, this is the way mocking and stubbing works. If you want to set an 
> expectation on an object that doesn't exist yet at the time you're setting up 
> the spec, you have to "chain" things so as to inject a mock of your own at 
> the right place, which you've done here. The amount of work you have to do 
> setting this up will vary from case to case.
>
> This is one of the costs of the interaction-based approached, and you have to 
> weigh up that cost against the benefits.

Out of curiosity, how would you do this with a state based approach?
I've tried checking the value of created_by after post :create but my
assign(:order) has no idea what :created_by is.
assigns(:order).created_by.should eq(mock_current_user) just doesn't
do what I thought it would.

Cheers,
- FJM
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to