[rspec-users] How do I best setup data for Story Runner?
Scott Taylor
mailing_lists at railsnewbie.com
Fri Sep 28 03:48:15 EDT 2007
On Sep 27, 2007, at 6:11 PM, Carl Porth wrote:
> On Sep 27, 2007, at 12:41 PM, Pat Maddox wrote:
>
>> On 9/26/07, Simon Peter Nicholls <simon at mintsource.org> wrote:
>>> Just started looking at the Story Runner integration, and am
>>> converting a few Rails integration tests to get a feel for it.
>>>
>>> My integration tests relied on fixtures, and since my models have a
>>> significant amount of validation (and hence need valid data unless I
>>> save without validation), this has made setup easy.
>>>
>>> With stories however, I'm wondering what the recommended approach
>>> is.
>>> Mocks are out I assume, since the point is testing the stack, but
>>> are
>>> fixtures out too? Should we be meeting our more complex or
>>> repetitive
>>> setup needs by treating it as plain ruby code that needs refactoring
>>> via regular Ruby/OO techniques (Object Mother et al)?
>>>
>>> A typical scenario for me might involve a couple of users with
>>> different roles, plus a collection of other collaborating objects.
>>>
>>> Thanks
>>> _______________________________________________
>>> rspec-users mailing list
>>> rspec-users at rubyforge.org
>>> http://rubyforge.org/mailman/listinfo/rspec-users
>>>
>>>
>>
>> I don't use fixtures (the yaml type, anyway) in story runner stories.
>> I construct objects in the given blocks. I find that that does two
>> things for me. First, it clearly expresses what a given really
>> means.
>> So when I say Given "an activated user," I don't have to go dig
>> around some YAML files. If I need to understand it I can just
>> look at
>> the code and see
>> u = User.create! :login => "pat"
>> u.activate
>>
>> Secondly, constructing your object graph instead of using fixtures
>> means you're actually exercising your code. With fixtures you just
>> instantiate some objects and fill them with data, which may not
>> necessarily be valid (they require maintenance). Also if you're
>> using
>> stuff like before/after create hooks to create child objects, using
>> fixtures bypasses that.
>>
>> I look at fixtures as a weird kind of mock. You're not using the
>> full
>> implementation, so what's the point really? I'd rather use a real
>> object or a proper mock object. In stories I don't use mocks at all,
>> so obviously I'll go for the full implementation.
>>
>> Pat
>> _______________________________________________
>> rspec-users mailing list
>> rspec-users at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/rspec-users
>
> +1
>
> I've adopted a factory pattern for organizing my tests inspired by:
> http://www.dcmanges.com/blog/38
>
Yeah, that post was great, and inspired me to create a plugin, which
has been essential to my workflow. Here is a screencast (and a
shameless plug) for it:
http://railsnewbie.com/files/fixture_replacement_demo.mov
I was/am quite tired (it's about 3 AM), so just forward through my
stupidity.
Regarding Pat's post: fixtures aren't a weird kind of mock, they are
real data. The problem is their large overhead in scaling to a
project of any size (especially the typical one with lots of
associations). Plus, fighting with YAML just sucks. Am I putting in
invalid data, or are those tabs instead of spaces? The truth is that
they are *PAINFUL* to use, and that's why no one uses them (and why
"testing" sucks, and is done after a project instead of before).
Personally, I'd love to use mocks in my model specs, but I just
can't bring myself to do it. It, too, is painful, because I
essentially need to understand the details of how activerecord
works. Why spend an hour figuring out that
User.find_or_create_by_username 'scott' should be stubbed out as
User.find("username" => "scott") and not User.find(:username =>
"scott")? Have you read Jay Field's blog recently? Stubbing
ActiveRecord::Connection::Column ? Give me a break. That's going to
break the second you upgrade rails.
Mocks are great for external libraries (or objects which you
control), but with rails everything is so tightly woven together that
mocking/stubbing seems to be more pain then it's worth. The only
positive thing the stub approach has going for it is the speed factor.
I'd be very interested in hearing how you are using mocks
successfully without the overhead of learning tons of plumbing.
Scott
More information about the rspec-users
mailing list