Access global variable in ruby unit tests

ruby, unit-testing, watir

Solution

Instance variables (ie @browser) defined in the `startup` method will not be available to the tests. Based on this old forum thread, http://www.ruby-forum.com/topic/144884, it is by design:

That behavior is by design. The "test isolation" ideal implies you shouldn't need to work too hard to get a clean slate each time a test case starts. Otherwise a test could rely on a @value from the previous test, and could rely on it in a way you don't notice.

Of course any other persistent variable could ruin test isolation. We don't stopand restart Ruby between each test case. But at least when it happens the @instance variables won't be to blame.

One workaround that I have used I have used to use the same browser across tests was to use a class variable (ie `@@browser`). The startup would look like the following. The other methods would similarly have to be updated to use `@@browser`.

def startup
  @@browser = Watir::Browser.new :ie
  @@browser.speed = :fast
end

Problem

I'm having problems using a global variable defined in the my test class, which then is referenced in the libraries file. I'm using Ruby 1.9.3p392 and test-unit 2.5.4. This is the code that runs the tests: ``` require 'rubygems' gem 'test-unit' require 'test/unit' require 'ci/reporter/rake/test_unit_loader' load '../lib/functions.rb' require 'watir' class Test_002 < Test::Unit::TestCase include Functions class << self def startup @browser = Watir::Browser.new :ie @browser.speed = :fast end def shutdown @browser.close end end def test_001_login login('some_url', 'some_user', 'some_passw') end end ``` And this is part of the library that contains the login function: ``` require 'rubygems' module Functions def login(url, user, passw) @browser.goto(url) ... end end ``` This is the output: ``` Started E =============================================================================== Error: test_001_login(Test_002) NoMethodError: undefined method `goto' for nil:NilClass (...) 23: end 24: 25: def test_001_login => 26: login('some_url', 'some_user', 'some_passw') 27: end 28: 29: end =============================================================================== Finished in 3.0043 seconds. 1 tests, 0 assertions, 0 failures, 1 errors, 0 pendings, 0 omissions, 0 notifications 0% passed 0.33 tests/s, 0.00 assertions/s ``` Any ideas?

Original source