如何重构API的RSpec测试

时间:2012-10-03 22:47:24

标签: ruby rspec sinatra rack-test

我已经为基于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),通常更多。

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

2 个答案:

答案 0 :(得分:3)

不使用metaprogramimng,您可以使用嵌套的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

答案 1 :(得分: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

更新

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