Ashley Moran wrote:

On Oct 19, 2008, at 10:31 pm, Caius Durling wrote:

Funny you should post this, I picked up merb today as well (seeing as the API is finally frozen) and was thinking about posting to see if anyone else was.

Well, I've done a bit more research (asking around on the Merb list), and it seems the best practice* in Merbland is to use controller specs in much the same way as Rails integration tests[1]. While I see the point that you should test behaviour not implementation, I think that goes a *little* too far. In short, it's not recommended to do the equivalent of:

  it "should create a new, unsaved person on GET to create" do
    Person.should_receive(:new).and_return(@person)
    get 'create'
  end

There is an API for this though[2], and it was deprecated as of RC1, but has now apparently been reintroduced.

Lawrence Pit on the merb list explains the syntax:
     # ==== Example
     #   dispatch_to(MyController, :create, :name => 'Homer' ) do
|controller|
     #     controller.stub!(:current_user).and_return(@user)
     #   end


And I assume it works similarly with the #get, #post etc. (I have yet to try it though, and I can't visualise a clean way to write specs with it.)


Anyway the whole discussion provoked me to crystallise my thoughts on Ruby web BDD, which I decided to blog[3], and I thought it may be of interest to people here, in case there's yet a third "right way" of doing things.

(If anyone finds this of interest, let me know. If so, I might start an "Adventures in Merb BDD" series - or something - on my blog.)


Ashley


* I've padded up in anticipation of the chair I know Aslak will hurl when he reads that ;o)

[1] http://www.slideshare.net/wycats/testing-merb-presentation
[2] http://merbivore.com/documentation/0.9.9/doc/rdoc/merb-core/index.html?a=C00000147&name=RequestHelper [3] http://aviewfromafar.net/2008/10/20/web-app-bdd-thoughts-as-i-move-to-merb


Yeah... In regards to the controller specs... I wouldn't call that 'best practice' or 'the' right way. I would call that wycats's way of testing and how most of the merb community has decided to follow suite. I'm not saying a purely mock-based approach is 'best practices' either- they are both good practices and infinitively better than the alternative of having no tests at all!

That being said, I'm a big proponent of outside-in development which is largely made possible by being able to spec out your interface with mocks *before* it exists. We had a good discussion on the tradeoffs of using mocks on this list recently. Here is a message from that thread, by Zach Dennis, in which he explains outside-in development very well:
http://rubyforge.org/pipermail/rspec-users/2008-September/008426.html

It seems like the merb community places more emphasis on application wide tests- which is good since that is all the customer will really care about in the end. Application wide tests are great (and that is why we have cucumber) but I wouldn't forgoe having a fast object level suite. Without a lightning fast suite the refactoring process will be drawn out and tracking down breaks can be harder without the focused object examples. That has been my experience at least and so that is why I like to have application level features which touch the entire stack and then have faster and more focussed object level specs that rely on mocking.

Like I said, that is how I like to development my apps and not 'the' right way to do it.

Anyways, thanks for sharing your findings.

-Ben


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

Reply via email to