Forum: RSpec AfterCurrentScenario block

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Cdf378de2284d8acf137122e541caa28?d=identicon&s=25 Matt Wynne (mattwynne)
on 2009-04-17 18:07
(Received via mailing list)
Is there currently a way to register a block to run after the current
scenario completes?

If not, we've implemented one. Would anyone be interested in us
submitting it as a patch to Cucumber?

Something like

Given "something that will not be rolled back after the scenario is
finished" do
   original = SomeClass.a_value
   SomeClass.a_value = 7

   AfterCurrentScenario do
     # undo stuff
     SomeClass.a_value = original
   end
end

If you're interested, our use case is for pagination, where we
explicitly set the length of a page to something much shorter than the
default in a step, so that we only have to create a small number of
objects to spill over onto another page. The page length value is set
on a class variable, and would pollute other tests, so we want to
reset it when the scenario is finished.

   e.g.  Given the maximum number of Users to display is 2
    And there are 3 Users
  When I view the Users page
  Then I should see the text "see all 3 users"

Matt Wynne
http://blog.mattwynne.net
http://www.songkick.com
0be0e4aa42aacd9a8a95c792de273ca7?d=identicon&s=25 Aslak Hellesøy (aslakhellesoy)
on 2009-04-17 18:40
(Received via mailing list)
Den 17. april. 2009 kl. 18.06 skrev Matt Wynne <matt@mattwynne.net>:

> Is there currently a way to register a block to run after the
> current scenario completes?
>
After.
> If not, we've implemented one. Would anyone be interested in us
> submitting it as a patch to Cucumber?
>
How is this different from After?

Aslak
48641c4be1fbe167929fb16c9fd94990?d=identicon&s=25 Mark Wilden (Guest)
on 2009-04-17 19:01
(Received via mailing list)
On Fri, Apr 17, 2009 at 9:06 AM, Matt Wynne <matt@mattwynne.net> wrote:
>
> If you're interested, our use case is for pagination, where we explicitly
> set the length of a page to something much shorter than the default in a
> step, so that we only have to create a small number of objects to spill over
> onto another page.

Is this necessary? I mean, is the page length so long that creating
that many objects takes appreciably longer than otherwise?

I like to leave such values as page length alone in a scenario,
because that's part of the user requirement (if not a vitally
important one).

///ark
3c28deaff162aeda44f2e0bcdca1dacf?d=identicon&s=25 Joseph Wilk (josephwilk)
on 2009-04-17 19:01
(Received via mailing list)
Matt Wynne wrote:
> Is there currently a way to register a block to run after the current
> scenario completes?
>
You could achieve the same thing with After and tags:

http://wiki.github.com/aslakhellesoy/cucumber/hooks

@please-clean-me
Scenario: dirty
   ...


After "@please-clean-me" do
    #clean
end

--
Joseph Wilk
http://blog.josephwilk.net
F86901feca747abbb5c6c020362ef2e7?d=identicon&s=25 Zach Dennis (zdennis)
on 2009-04-17 19:03
(Received via mailing list)
On Fri, Apr 17, 2009 at 12:31 PM, Aslak
Hellesøy<aslak.hellesoy@gmail.com> wrote:
>
>
> Den 17. april. 2009 kl. 18.06 skrev Matt Wynne <matt@mattwynne.net>:
>
>> Is there currently a way to register a block to run after the current
>> scenario completes?
>>
> After.

After is used after *any* scenario completes thought, right? If you
add an After block inside of a step definition, it's going to be
executed from that point on, rather than clear out at the end of the
scenario that ran it, correct?

>> If not, we've implemented one. Would anyone be interested in us submitting
>> it as a patch to Cucumber?
>>
> How is this different from After?

* It clears out after the current scenario.
* It doesn't require to be run for scenarios that don't need it.
* It allows you to cleanly place the handler next to the code that it
is so closely related
* It doesn't require you know the name of the scenario(s) that would
need it (it's simply determined by if a step definition is run)

>>  AfterCurrentScenario do
>> finished.
>> _______________________________________________
>> 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
>



--
Zach Dennis
http://www.continuousthinking.com
http://www.mutuallyhuman.com
0be0e4aa42aacd9a8a95c792de273ca7?d=identicon&s=25 Aslak Hellesøy (aslakhellesoy)
on 2009-04-17 19:22
(Received via mailing list)
Den 17. april. 2009 kl. 18.58 skrev Zach Dennis <zach.dennis@gmail.com>:

>> After.
>
> After is used after *any* scenario completes thought, right? If you
> add an After block inside of a step definition, it's going to be

Aha now I understand. Matt, would Joseph's suggestion work for you?

Aslak
Cdf378de2284d8acf137122e541caa28?d=identicon&s=25 Matt Wynne (mattwynne)
on 2009-04-18 00:01
(Received via mailing list)
On 17 Apr 2009, at 18:20, Aslak Hellesøy wrote:

>>>> scenario completes?
>>>>
>>> After.
>>
>> After is used after *any* scenario completes thought, right? If you
>> add an After block inside of a step definition, it's going to be
>
> Aha now I understand. Matt, would Joseph's suggestion work for you?
>
> Aslak

It would work, yes, but I have to say I like ours a bit better - you
can put the undo code right next to the code it's undoing, as Zach
pointed out. With the tags thing I'd have to put a tag in the feature
file which is introducing a tiny bit more coupling and noise which I'd
rather avoid.

I had pondered on the idea of changing the After method to use a
syntax a bit like RSpec's #before(:each) where we could say:

After(:each) do
   # general post-scenario clean-up

After(:current) do
   # one-time clean-up

Anyway, just a thought.

Matt Wynne
http://blog.mattwynne.net
http://www.songkick.com
This topic is locked and can not be replied to.