Способ, которым я сделал бы это в этом случае, состоит в том, чтобы указать запрос как лямбда, который его выполняет.Таким образом, я могу ссылаться на него в моих общих спецификациях и устанавливать разные для каждого типа запроса.
Мне нравится использовать блоки rspec description, когда оно устанавливает ожидание, в этом случае используется конкретный метод запроса,Все это будет выглядеть примерно так:
describe FooController do
shared_examples_for "any request" do
it "assigns foo" do
@request.call
assigns[:foo].should == "bar"
end
it "does not change the number of bars" do
@request.should_not change(Bar, :count)
end
end
context "using GET" do
before do
@request = lambda { get "index" }
end
it_should_behave_like "any request"
end
end
Еще более чистый способ - использовать конструкцию let, хотя для новичка это может быть слишком глубоко в магии rSpec:
describe FooController do
shared_examples_for "any request" do
it "assigns foo" do
request.call
assigns[:foo].should == "bar"
end
it "does not change the number of bars" do
request.should_not change(Bar, :count)
end
end
context "using GET" do
let(:request) { lambda { get "index" } }
it_should_behave_like "any request"
end
end