[rspec-users] A spec where interaction-based testing breaks down... (at least for now)

Martin Emde martin.emde at gmail.com
Thu Jan 25 15:02:42 EST 2007


On 1/24/07, aslak hellesoy <aslak.hellesoy at gmail.com> wrote:
>
> On 1/24/07, Pat Maddox <pergesu at gmail.com> wrote:
> > Here are the specs:
> > context "Finding all the stylesheets available to a company" do
> >   setup do
> >     @mock_company = mock("company")
> >     @mock_company.stub!(:to_param).and_return "1"
> >     Stylesheet.stub!(:find)
> >   end
> >
> >   def do_find
> >     Stylesheet.find_available_to @mock_company
> >   end
> >
> >   specify "should convert the company into a parameter" do
> >     @mock_company.should_receive(:to_param).and_return "1"
> >     do_find
> >   end
> >
> >   specify "should find stylesheets belonging to only the company or to
> > nobody" do
> >     Stylesheet.should_receive(:find).with(:all, :conditions =>
> > ["company_id IS NULL OR company_id=?", "1"])
> >     do_find
> >   end
> > end
> >
> > And here's the code:
> > class Stylesheet < ActiveRecord::Base
> >   def self.find_available_to(company)
> >     find :all, :conditions => ["company_id IS NULL OR company_id=?",
> > company.to_param]
> >   end
> > end
> >
> > You can see that the implementation is duplicated.  In fact, I wrote
> > the implementation in the spec and then basically just copied it over.
> >
> > That bugs me.
> >
> > The obvious way to fix it would be to create a couple stylesheet
> > entries in the database, run the query, and see if it matches the
> > expected results.
> >
> > The only benefit of the current approach (that I can see) is that the
> > behavior is explicit.  If you've just got the results, you have to
> > mentally link them to the query.
> >
> > Anyway I'm just sort of stuck on this one.  I think there's a much
> > better way that is evading me.
> >
>
> I wouldn't use mocks for model specs. I'd test it against the real
> database.
>
> Aslak


In addition to actually finding real records from the database for the
Stylesheet model (don't stub find), I would also suggest that to_param is
not the right method to use in this case. You're stating that company_id
should equal the url formatted string for a company (which it is typical to
overload to handle things like 10-name_of_company). Clearly your database
naming says company.id so it's safer to just use company.id.

-Martin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://rubyforge.org/pipermail/rspec-users/attachments/20070125/32558d34/attachment.html 


More information about the rspec-users mailing list