Forum: RSpec [Rspec] How do you nest before(:all) or after(:all) blocks?

Eb5d777c26bd592000c1914717c3df7e?d=identicon&s=25 John Kolokotronis (Guest)
on 2009-02-04 10:11
(Received via mailing list)
Hi all,

I'm new to Rspec but loving it so far and looking to use it as a
replacement for a Test::Unit framework I have which drives a web app
via Watir. So far, things have worked very well with Rspec but I can't
get my head around how before/after(:all) blocks would work in nested
groups, or even if what I am doing is possible.

What I want to do is something like this:

describe "This is a set of tests: " do
  before(:all) do
    puts "this should only appear once"
  end

  describe "Test 1" do
    puts "test 1"
  end

  describe "Test 2" do
    puts "test 2"
  end
end

Expecting the before(:all) block to run only once and see something
like:

- this should only appear once
- test 1
- test 2

but what I am getting is:

- this should only appear once
- test 1
- this should only appear once
- test 2

So my question is, how can you add before/after(:all) blocks that run
once and only once for for all examples, if all the examples are
nested in one main describe block? Is that something that's even
possible? I'd appreciate any pointers anyone may have. Thanks!

Regards,

John
5d38ab152e1e3e219512a9859fcd93af?d=identicon&s=25 David Chelimsky (Guest)
on 2009-02-04 15:09
(Received via mailing list)
On Wed, Feb 4, 2009 at 3:07 AM, John Kolokotronis <johnjkle@gmail.com>
wrote:
> describe "This is a set of tests: " do
>        end
>
> - this should only appear once
> - test 1
> - this should only appear once
> - test 2
>
> So my question is, how can you add before/after(:all) blocks that run
> once and only once for for all examples, if all the examples are
> nested in one main describe block? Is that something that's even
> possible? I'd appreciate any pointers anyone may have. Thanks!

Right now it's not possible. There's an open ticket on this:

http://rspec.lighthouseapp.com/projects/5645/tickets/632
369b9fd2a0d9e7cdbc60907a2a056ad9?d=identicon&s=25 Scott Taylor (Guest)
on 2009-02-04 16:33
(Received via mailing list)
John Kolokotronis wrote:
> describe "This is a set of tests: " do
>   end
>
>
Why do you want before(:all)?  Generally it's use is disregarded, just
as global variables are considered harmful, not because they can't be
used well, but because 99% of the times they aren't.

Scott
Eb5d777c26bd592000c1914717c3df7e?d=identicon&s=25 John Kolokotronis (Guest)
on 2009-02-04 16:46
(Received via mailing list)
Thanks for the reply David - much appreciated. At least now I know
that it can't be done, rather
than pursuing it further for now. I'll just have to live without that
functionality for now and add
it later on if a fix is made available.

Regards,

John
Eb5d777c26bd592000c1914717c3df7e?d=identicon&s=25 John Kolokotronis (Guest)
on 2009-02-04 19:23
(Received via mailing list)
> Why do you want before(:all)?  Generally it's use is disregarded, just
> as global variables are considered harmful, not because they can't be
> used well, but because 99% of the times they aren't.

Because I want to be able to create a single @browser object at the
beginning
of my tests and have it passed to all examples. Without nested
examples, that
works just fine - I can create my browser instance in the before(:all)
block and
avoid using a global variable. In nested examples, I don't see a good
way to
do that - I could always set up the browser instance as a global (did
that in
the past with Test::Unit and many Watir users do so) but I'd like to
avoid this.

If I didn't use a before(:all) block or a global variable, would there
be any way to
pass my browser object to all example groups?

Currently my tests look like this:

describe "A series of tests" do
  before(:all) do
    @browser = Watir::Browser.new
  end

  it "Test 1: it should go to www.google.com" do
    @browser.goto("www.google.com")
  end
end

Obviously, been able to use nested describe groups would make the
tests easier
to read for non-coders here and that's why I wanted to use them...

Regards,

John
Cdf378de2284d8acf137122e541caa28?d=identicon&s=25 Matt Wynne (mattwynne)
on 2009-02-05 08:56
(Received via mailing list)
On 4 Feb 2009, at 17:55, John Kolokotronis wrote:

>> Why do you want before(:all)?  Generally it's use is disregarded,
>> just
>> as global variables are considered harmful, not because they can't be
>> used well, but because 99% of the times they aren't.
>
> Because I want to be able to create a single @browser object at the
> beginning
> of my tests and have it passed to all examples. Without nested
> examples, that

Have you considered using Cucumber rather than RSpec as the driver to
run these tests?

Matt Wynne
http://blog.mattwynne.net
http://www.songkick.com
Eb5d777c26bd592000c1914717c3df7e?d=identicon&s=25 John Kolokotronis (Guest)
on 2009-02-05 10:22
(Received via mailing list)
> Have you considered using Cucumber rather than RSpec as the driver to  
> run these tests?


TBH, I haven't really looked at Cucumber much, as I'm just getting
started with Rspec itself. My impression though was that Cucumber
replaced the story runner and the way my tests are structured just
seems better suited to Rspec, rather than written as user stories...
02fcf5cb79435eeb66f951c11334ed3e?d=identicon&s=25 Dhananjay V. (dhananjay_v)
on 2013-10-24 20:39
David Chelimsky wrote in post #777566:
> On Wed, Feb 4, 2009 at 3:07 AM, John Kolokotronis <johnjkle@gmail.com>
> wrote:
>> describe "This is a set of tests: " do
>>        end
>>
>> - this should only appear once
>> - test 1
>> - this should only appear once
>> - test 2
>>
>> So my question is, how can you add before/after(:all) blocks that run
>> once and only once for for all examples, if all the examples are
>> nested in one main describe block? Is that something that's even
>> possible? I'd appreciate any pointers anyone may have. Thanks!
>
> Right now it's not possible. There's an open ticket on this:
>
> http://rspec.lighthouseapp.com/projects/5645/tickets/632

I could not see the status of the ticket as it was restricted..Any
updates with regards to the use of the global variable objects in the
same script call before test.. Any best practices mentioned or
suggested???
02fcf5cb79435eeb66f951c11334ed3e?d=identicon&s=25 Dhananjay V. (dhananjay_v)
on 2013-10-24 20:39
> http://rspec.lighthouseapp.com/projects/5645/tickets/632


something i wish i could get additional information from other users??


I could not see the status of the ticket as it was restricted..Any
updates with regards to the use of the global variable objects in the
same script call before test.. Any best practices mentioned or
suggested???
This topic is locked and can not be replied to.