Я создаю API-интерфейс JSON для отдыха с использованием Rails, и я хотел бы протестировать представления ресурсов, которые я получаю с сервера.
Я хочу проверить ответ в нескольких местах, поэтому я создал общую группу примеров, которая описывает материал, который я ожидаю получить в одном ресурсе.Выглядит это примерно так:
describe "Widget API" do
shared_examples_for "a widget resource" do
subject { resource }
its ['id'] { should == widget.id }
its ['name'] { should == widget.name }
its ['owner'] { should == widget.owner }
end
describe "a GET request to /widgets/:id" do
before(:each) do
@widget = Factory(:widget)
get widget_path(@widget)
end
it_behaves_like "a widget resource" do
let(:widget) { @widget }
let(:resource) { ActiveSupport::JSON.decode(response.body.strip) }
end
end
end
Запрос сделан, и общая группа примеров вызывается как с хешированным телом ответа, так и с исходным объектом виджета, чтобы их можно было сравнить.
Это работает довольно хорошо, и у меня есть только одна возможность обновить свои тесты, если мне нужно что-то добавить / изменить в представлении виджета.
Проблема, с которой я сталкиваюсь, заключается в том, что я хочу проверить массив ресурсов виджетов произвольного размера, скажем, например, при запросе действия index:
describe "a GET request to /widgets" do
before(:each) do
@widgets = [Factory(:widget), Factory(:widget), Factory(:widget)]
get widgets_path
end
### Something like this would be nice:
it "responds with an array of widgets" do
@resources = ActiveSupport::JSON.decode(response.body.strip)
@widgets.each_with_index do |widget, index|
it_behaves_like "a widget resource" do
let(:widget) { widget }
let(:resource) { @resources[index] }
end
end
end
end
(Это немногонадумал, но я думаю, что это как бы описывает то, что я ищу.)
Проблема выше в том, что метод it_behaves_like
недоступен в контексте блока it
, поэтому я получаю NoMethodErrorsброшен в меня.
Есть ли какой-нибудь способ сделать этот тип перечисления по предмету и вызвать общую группу примеров для каждого из элементов субъекта?Я здесь далеко от базы?Есть ли лучший способ структурировать это?
Спасибо за любые предложения!
-Джон