Как я могу проверить каждый элемент в массиве, используя общие примеры групп RSpec? - PullRequest
0 голосов
/ 02 июня 2011

Я создаю 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брошен в меня.

Есть ли какой-нибудь способ сделать этот тип перечисления по предмету и вызвать общую группу примеров для каждого из элементов субъекта?Я здесь далеко от базы?Есть ли лучший способ структурировать это?

Спасибо за любые предложения!

-Джон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...