Tony Gutierrez
Tony Gutierrez

Reputation: 771

How to define a simple global variable in an rspec test that can be accesed by helper functions

I cant figure out how to use a simple global variable in an rspec test. It seems like such a trivial feature but after much goggleing I havent been able to find a solution.

I want a variable that can be accessed/changed throughout the main spec file and from functions in helper spec files.

Here is what I have so far:

require_relative 'spec_helper.rb'
require_relative 'helpers.rb'
let(:concept0) { '' }

describe 'ICE Testing' do
    describe 'step1' do
    it "Populates suggestions correctly" do
         concept0 = "tg"
         selectConcept() #in helper file. Sets concept0 to "First Concept"
         puts concept0  #echos tg?? Should echo "First Concept"
    end
 end

.

 #helpers.rb
 def selectConcept
      concept0 = "First Concept"
 end

Can someone point out what I am missing or if using "let" is totally the wrong method?

Upvotes: 12

Views: 22178

Answers (4)

Mike Slinn
Mike Slinn

Reputation: 8403

I suggest you define the variable in the helper file, where it can be used by other helper code, and can be accessed from your tests.

For my project, I wanted to keep all the setup stuff in spec_helper.rb, and use those settings, plus any custom variables and methods in the tests. The following, modified from the RSpec-core 3.12 docs, is not Rails-specific.

Create a new setting for RSpec.configure called my_variable, and give it a value, like this:

# spec/spec_helper.rb

RSpec.configure do |config|
  config.add_setting :my_variable
  config.my_variable = "Value of my_variable"
end

Access settings as a new read-only property in RSpec.configuration from your test:

# spec/my_spec.rb

RSpec.describe(MyModule) do
  it "creates an instance of something" do
    my_instance = MyModule::MyClass.new(RSpec.configuration.my_variable)
  end
end

Upvotes: 3

Max Cascone
Max Cascone

Reputation: 833

This is an old thread, but i had this question today. I just needed to define a long string to stub out a command that is in multiple files as:

# in each spec file that needed it
let(:date_check) do
   <<~PWSH.strip
   # lots of powershell code
   PWSH
end

# in any context in that file (or a shared context)
before(:each) do
  stub_command(date_check).and_return(false)
end

Searched, Stack Overflow, etc, landed on this: Note the usage of the variable doesn't change at all! (Assumes all specs require 'spec_helper')

# in spec_helper.rb
def date_check 
  <<~PWSH.strip
  # lots of powershell code
  PWSH
end

# in any context in any spec file
before(:each) do
  stub_command(date_check).and_return(false)
end

Upvotes: 0

Winston Kotzan
Winston Kotzan

Reputation: 2087

Consider using a global before hook with an instance variable: http://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration

In your spec_helper.rb file:

RSpec.configure do |config|
  config.before(:example) { @concept0 = 'value' }
end

Then @concept0 will be set in your examples (my_example_spec.rb):

RSpec.describe MyExample do
  it { expect(@concept0).to eql('value') } # This code will pass
end

Upvotes: 13

Tony Gutierrez
Tony Gutierrez

Reputation: 771

It turns out the easiest way is to use a $ sign to indicate a global variable.

See Preserve variable in cucumber?

Upvotes: 8

Related Questions