RSpec: Hierarchical Specifications
RSpec is full of great features, but some of them either not very well documented or hidden to a naked eye. No wonder if you never discovered hierarchical specifications.
Traditionally, we write specifications like this:
describe AClass, "when doing this" do
...
end
describe AClass, "when doing that" do
...
end
Now imagine that you have some very similar specs with some common initialization:
describe AClass do
before do
...
end
describe "when doing this" do
before do
...
end
...
end
describe "when doing that" do
before do
...
end
...
end
end
You can see that you have common initializations for examples from both specifications and specific initializations for examples from each.
In the previous post I wrote that I prefer not to define helper methods outside the specification definition as they become global and tend to intersect with methods defined in other specs. So, what is the solution?
Assuming that you have a method “authenticate” that you need to call before every example in several specifications, you can define an upper-level specification “authenticated” and group other specs, like this:
describe AClass, "(authenticated)" do
before do
authenticate
end
describe "when doing this" do ... end
describe "when doing that" do ... end
def authenticate
...
end
end
Now you have it all in a safe way!