When you need to find out in which kind of spec you are during run-time, it's definitely possible. It's a lot easier in RSpec 2+.
For example, consider this global before
block where you'd want to run some code for specific specs only:
config.before do
# stuff
that_fancy_method
# more stuff
end
RSpec 2+
If you want to run such a block for a specific type of specs, you can use filters Show archive.org snapshot :
config.before do
# stuff
# more stuff
end
config.before :type => 'controller' do
that_fancy_method
end
If that's not enough for you, query your example's metadata:
example.metadata[:type]
# => "controller"
From an example itself or a before
block, query self.class.metadata
.
RSpec 1
Unfortunately, RSpec 1 doesn't offer such filters, and the helpful metadata
isn't around either. However, you can still get something similar by looking at self.class.ancestors
. For example:
config.before do
# stuff
that_fancy_method if is_a? Spec::Rails::Example::ControllerExampleGroup
# more stuff
end
Find out if you are in a spec that knows about request and response
You can use the RSpec 1 approach to find out if your current example knows about RSpec's request
and response
, like helper specs or controller specs:
if is_a? Spec::Rails::Example::FunctionalExampleGroup
that_fancy_request_thing
end
Note that you should not check via something like respond_to?(:request)
since that would break horribly in specs that let(:request)
.
The example above is from RSpec 1 -- the class to check against might be different for RSpec 2.