The RSpec examples are generally run in a single ruby process. It dosen't matter until your code introduces some global variables, which would be polluted between examples. A common solution is to reset them in the after hook, but it breaks the DRY rule and would brings a lots of extra works. The best way is to run them in separated sub processes. This gem would help you to achieve this within a single method call.
This gem depends on Rspec 2.0 and above. You should have it installed before using this gem.
sudo gem install rspec-isolation
Note: The installation would NOT automatically install the rspec 2.0.
Image a spec file exists:
$greeting = "Hello, world!"
describe "Test with global vars" do
it "should be replaced with my name" do
$greeting.gsub!(/\bworld\b/, "Kevin")
$greeting.should == "Hello, Kevin!"
end
it "should be replaced with my hometown name" do
$greeting.gsub!(/\bworld\b/, "Wuhan")
$greeting.should == "Hello, Wuhan!"
end
end
The $greeting
is polluted in the first example and the second example would failed.
Now we require this gem:
require 'rspec/isolation'
Then you can choose one of the following ways to enable the isolation:
1. Using iso_it
:
require 'rspec/isolation'
$greeting = "Hello, world!"
describe "Test with global vars" do
iso_it "should be replaced with my name" do
$greeting.gsub!(/\bworld\b/, "Kevin")
$greeting.should == "Hello, Kevin!"
end
it "should be replaced with my hometown name" do
$greeting.gsub!(/\bworld\b/, "Wuhan")
$greeting.should == "Hello, Wuhan!"
end
end
Now the first example would be run in a sub process.
2. Using run_in_isolation
in before(:each)
hook:
require 'rspec/isolation'
$greeting = "Hello, world!"
describe "Test with global vars" do
before(:each) do
run_in_isolation
end
it "should be replaced with my name" do
$greeting.gsub!(/\bworld\b/, "Kevin")
$greeting.should == "Hello, Kevin!"
end
it "should be replaced with my hometown name" do
$greeting.gsub!(/\bworld\b/, "Wuhan")
$greeting.should == "Hello, Wuhan!"
end
end
Now all examples would be run in separated sub processes. Note: It won't work if you put run_in_isolation
in a before(:all)
hook.
Kevin Fu, corntrace@gmail.com, @corntrace. If you like and use this gem, please feel free to give me any recommandation.