[rspec-users] Reusing story snippets
David Chelimsky
dchelimsky at gmail.com
Tue Jun 17 12:02:53 EDT 2008
On Jun 17, 2008, at 10:41 AM, Ben Mabey wrote:
> David Chelimsky wrote:
>> Reordered your posts so my comments make sense (we prefer to avoid
>> top-posting - even though I sometimes violate that myself :) ).
>>
>>
>>> On Jun 16, 11:58 pm, Jim Morris <wolfma... at gmail.com> wrote:
>>>
>>>> I'm not using Rails, I am doing end to end integration testing
>>>> talking
>>>> to the server via net/http, so RailsStory is not involved.
>>>>
>>
>> Cool. Are you talking directly through ruby constructs or through a
>> browser tool like selenium?
>>
>>
>>>> I think the listeners may do it, I can use story_started like
>>>> before(:all) and story_ended like after(:all) which will be great,
>>>> presuming story_ended is always called even after a failure.
>>>>
>>
>> Yep.
>>
>>
>>>> However I am missing the place where that listener gets
>>>> registered, I
>>>> am using the...
>>>>
>>>> Story "description", %{...}, :steps_for => steps do
>>>> Scenario "sdsdsd" do
>>>> ...
>>>> end
>>>> end
>>>>
>>>> syntax, so where is the listener set?
>>>>
>>>> Thanks
>>>>
>>
>> On Tue, Jun 17, 2008 at 2:28 AM, Jim Morris <wolfmanjm at gmail.com>
>> wrote:
>>
>>> Ahh ok think I found it...
>>>
>>> In my test file at the start...
>>>
>>> class MyListener
>>> def method_missing sym, *args, &block
>>> # ignore all messages you don't care about
>>> end
>>>
>>> def story_started(title, narrative)
>>> puts "...Started story #{title}"
>>> end
>>>
>>> def story_ended(title, narrative)
>>> puts "...Ended story #{title}"
>>> end
>>> end
>>>
>>> Spec::Story::Runner.register_listener(MyListener.new)
>>>
>>
>> Yep. That's the right way.
>>
>>
>>> Then I define my steps using StepGroup.new
>>>
>>
>> You can just use the steps_for method and it'll still work.
>>
>>
>>> Then the Scenarios
>>>
>>> It seems to work although not very intuitive :)
>>>
>>> I'd prefer a before(:all) and after(:all)
>>>
>>
>> I'm not with you on that, but I'm open :) We could solve the OP's
>> problem with something like this:
>>
>> Before Each Scenario:
>> Log in as admin
>>
>> Scenario: editing private data
>> ...
>>
>> Before Each Scenario would match a Given step definition "Log in as
>> $role" or something like that.
>>
>> I'm just not sure this really heads us down the right path. Next
>> thing
>> you know we'll have Before Story, After Each Scenario, After Story,
>> etc and the stories are going to start looking less and less like
>> stories and more and more and more like code, at which point you
>> should be using example groups instead :)
>>
>> Anybody else have opinions about that?
>>
>> Cheers,
>> David
>>
>>
> I *really* don't like the idea of having a "Before Each Scenario" or
> similar construct. I have already seen abuses of the story runner
> where the stories look too much like code/examples. I think adding
> such language to the story runner would really hurt and confuse the
> original intent of stories. I'm not questioning whether such an
> addition would be helpful, I think it would and I may at times use
> it.. but IMO it would only be helpful to the developers point of
> view and I don't see it really adding much value to the stories. If
> someone can offer an example where they think such language would
> help the stakeholder I would be interested but to me it is starting
> too look too much like examples.
>
> Like Kyle said in a previous post, I think a better way to handle
> these situations is to rely on the fact that having an admin be
> logged in is somewhat implicit in the story and that the
> implementation can be handled under the covers, so to speak, with
> helper methods within the steps. This of course will require you to
> call the same helper method for all of your first Given steps. So I
> guess this is where the pain point is.. but it doesn't seem to be a
> big one most of the time.
>
> The Listeners are good for application-wide/story suite wide setup
> and cleanup, like databases as such. Placing the login of an admin
> into a listener would obviously be overkill unless all of your
> stories involved an Admin being logged in. What people seem to
> asking for is more control over the granularity of which stories a
> particular listener effects. Say, for example you have a set of
> stories that all require that an Admin account to exist with certain
> permissions and that the admin is logged in. What if you could
> define your AdminSetupListener and then hook it into the runner for
> your stories like so:
>
> with_steps_for
> (:admin_section, :webrat).and_listeners_for(:admin_setup) do
> run_story(File.expand_path(__FILE__))
> end
>
> This could provide the setup/teardown capabilities for a certain set
> of stories without polluting the Story language.
>
> Does that make sense what I'm suggesting? I'm not sold entirely on
> it myself. It seems to add yet another layer of abstraction to help
> DRY up the steps and in so doing spreads the story's executable code
> throughout even more files. This could hurt maintainability so I
> think the use of this could also be abused... but if people want
> more granular control in there setup and teardown with the Stories I
> would vote for an option like this instead of placing it in the
> actual Story language/parser itself.
>
> I hope most of that makes sense. :)
Perfect sense to me :)
Cheers,
David
>
>
> -Ben
>
>
>
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
More information about the rspec-users
mailing list