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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

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

Reply via email to