如何使用RSpec的共享示例组验证数组中的每个项目?

时间:2011-06-02 17:32:40

标签: ruby-on-rails rspec

我正在使用Rails构建一个rest-ish JSON API,我想测试我从服务器返回的资源表示。

我想在多个地方验证响应,因此我创建了一个共享示例组,用于描述我希望在单个资源中拥有的​​内容。它看起来像这样:

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

发出请求,并使用哈希响应主体和原始窗口小部件对象调用共享示例组,以便可以比较它们。

这非常有效,如果我需要在窗口小部件表示中添加/更改某些内容,我只有一个位置可以更新我的测试。

我遇到的问题是,当我想验证任意大小的窗口小部件资源数组时,例如,在请求索引操作时:

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。

有没有办法对主题进行这种类型的枚举,并在每个主题元素上调用共享示例组?我离开基地吗?有没有更好的方法来构建它?

感谢您的任何建议!

-John

0 个答案:

没有答案