Is it possible to access Example scope from Formatter?

Hello.

I’m using Watir to perform some user interface tests. I’ve made my own
custom html formatter to make a screenshot and capture html of the
page, on which some spec fails.

Now, the problem is simple - I have to access the browser object from
my formatter to get window handle (for screenshot) and to get html of
the page. I thought that maybe it’s possible to access the Example
object directly so I could get access to Example object instance
variables and helper methods, but it seems that only Proxies are in
use everywhere and they seem to be pretty limited.

Currently I’m just using global variable $browser instead, so I can
access it from the Formatter, but I’m not happy with global variables.

After fiddling around a little I thought that maybe someone has better
solution for the above mentioned problem.

Jarmo

On Sun, Oct 18, 2009 at 1:36 PM, Jarmo P. [email protected]
wrote:

variables and helper methods, but it seems that only Proxies are in
use everywhere and they seem to be pretty limited.

Currently I’m just using global variable $browser instead, so I can
access it from the Formatter, but I’m not happy with global variables.

After fiddling around a little I thought that maybe someone has better
solution for the above mentioned problem.

in the example

it “does something” do
options[:browser] = Selenium.new(…)

end

in the formatter

def example_started(example)
example.options[:browser] # => same browser created in the example
end

HTH,
David

Jarmo

Thank you for the reply!

I have to admit that for a second I thought about using ‘options’
somehow, but wasn’t sure if it would work or not so i forgot the
possibility to use it at all and tried different approaches.

Anyway, it seems that your exact code snippet doesn’t work so I made
one formatter and spec to see what happens. Formatter is written like
this:
require ‘spec/runner/formatter/base_text_formatter’

class OptionsFormatter < Spec::runner::Formatter::BaseTextFormatter

def example_group_started(example_group_proxy)
puts “example_group_started”
p example_group_proxy.options
super
end

def example_started(example_proxy)
puts “example_started”
p example_proxy.options
super
end

def example_passed(example_proxy)
puts “example_passed”
p example_proxy.options
super
end

def example_failed(example_proxy, counter, failure)
puts “example_failed”
p example_proxy.options
super
end

end

and spec:
require ‘spec’

describe “optionsformatter” do

before :all do
options[:all] = “all”
end

before :each do
options[:each] = “each”
end

it “one” do
options[:it] = “passing”
end

it “two” do
options[:it] = “failing”
raise
end

end

When running the spec, then output will be something like this:
example_group_started
{}
example_started
{}
example_passed
{:it=>“passing”, :each=>“each”}
example_started
{}
example_failed
{:it=>“failing”, :each=>“each”}

In short - it seems that when example_group_started is invoked, then
options set in before :all doesn’t propagate into formatter (at least
I thought that this would be logical thing to happen). Secondly, there
isn’t also anything in options when example_started is invoked and
only real place to get anything useful from options is from
example_passed or example_failed. Is this expected?

Happily it also shows options from before :each, which enabled me to
use “configure” from my environment file something similar to:

Spec::Runner.configure do |config|
config.before(:each) {options[:browser] = BrowserClass.instance}
end

And in Formatter under example_failed to get the browser object. It
makes sense to get this browser object only for failing examples
anyway, since no screenshots are made for passing examples.

So now I don’t have to explicitly set options from every example or
example group and it is done automatically :slight_smile:

Jarmo