我正在使用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