3

我有一系列基于 Sinatra 的 API 的 RSpec 测试,并希望重构它们以使它们更简单并减少重复。

这是一个路由测试的示例:

describe 'post /sections with empty data' do
    before do

        params = {
            :site_id    => site.id,
            :page_id    => page.id,
        }

        post '/sections', params, @session
    end

    specify { last_response.status.should == 200 }
    specify { json_response['id'].should_not be_nil }
    specify { json_response['type'].should == default_section_type }
end

每个测试都将使用相同的基本 URL,具有相同的会话数据,唯一的区别是参数以及响应应该是什么。每条路由至少有 4 个测试(GET、POST、PUT、DELETE),通常更多。

有没有办法让这些测试更易于管理?

4

2 回答 2

3

在不求助于元编程的情况下,您可以使用嵌套describe块来仅覆盖您想要的参数:

describe "/sessions" do
  before do
    send(http_method, "/sessions", params, @session)
  end

  describe "with POST" do
    let(:http_method) { :post }

    describe "and empty data" do
      let(:params) do
        { :site_id => site.id, :page_id => page.id }
      end

      specify { last_response.status.should == 200 }
      specify { json_response['id'].should_not be_nil }
      specify { json_response['type'].should == default_section_type }
    end

    describe "with non-empty data" do
      let(:params) do
        # relevant params
      end
    end
  end

  describe "with GET" do
    let(:http_method) { :get }

    # ...
  end
end
于 2012-10-03T23:03:48.643 回答
1

不知道这是否有效,但它可以让您了解您可以做什么

describe ' /sections with empty data' do
    before(:all) do
      @params = {
            :site_id    => site.id,
            :page_id    => page.id,
        }
    end

    after(:each) do
      specify { last_response.status.should == 200 }
      specify { json_response['id'].should_not be_nil }
      specify { json_response['type'].should == default_section_type }
    end

    [:get, :post, :put, :delete].each do |http_method|
        it "works with #{http_method}" do
            send(http_method) '/sections', @params, @session
        end
    end
end

更新

再次阅读你的问题让我意识到这不是你真正要求的。如果它根本没有帮助告诉我,所以我删除它。

于 2012-10-03T23:06:44.473 回答