0

我对 RSpec 很陌生。我正在为我们在 Rails 中制作的 REST API 编写测试。API 由一个动作组成,其将接受的请求具有以下规范:

只有在以下情况下才会接受请求:

  • 它是使用 HTTPS 制作的
  • 它作为 POST 请求发送
  • 它使用以下参数发送:value_name、value、item_id

例如,一个有效的请求是:

POST /new_api/action HTTPS/1.0
snip
Content-Type: application/x-www-form-urlencoded
Content-Length: 52

value_name=Contract+Id&value=abcdef123456&item_id=38

规范规定,如果发送满足这些要求的请求,服务器将使用200代码进行响应。如果发送的请求不符合这些要求,服务器将使用400代码进行响应。

有了这些要求,我想编写 RSpec 测试,以确保操作根据请求是否响应正确的代码:

  • 使用 HTTP/SSL 发送
  • 使用POST或不同的请求类型发送
  • 有正确的参数

这是我要编写的测试之一的伪 Ruby:

describe 'New REST API' do
  it 'should accept valid requests'
    request = mock a request that
      uses HTTPS
      has these parameters: {:value_name => "name",\
        :value => 1, :item_id => 2}
    end

    post name_of_new_action using request
    response.status.should be(200)
  end
end

RSpec 中的正确钩子是什么:

  1. 模拟请求
  2. 指示请求应该或不应该通过 HTTPS/SSL “发送”
  3. 指示应将哪些参数发送到服务器
  4. 模拟通过 POST 发送请求
  5. 检查服务器的响应代码是什么

我们正在使用 Rails 3.2.13 和 Ruby 1.8.7(这是我们正在维护的旧应用程序)。我们的 Gemfile 有

gem 'rspec-rails', '~> 2.11.0'
gem 'guard-rspec', '~> 1.2.1'
gem 'capybara', '~> 1.1.2'
gem 'database_cleaner', '~> 1.1.1'
gem 'factory_girl_rails', '~> 1.7.0
4

1 回答 1

1

您需要的一切都是 Rails 集成测试库中的原生内容,甚至不需要 Rspec。

  • 它是使用 HTTPS 制作的

    get test_path, nil, {'HTTPS'=>'on'}
    
  • 它作为 POST 请求发送

    post test_path, {foo: 'bar', fff: 'bbb'}
    
  • 它使用以下参数发送:value_name、value、item_id,在 HTTPS 中。

    post test_path, {value_name: 'abc', value: 'foo', item_id: 'bar'}, {'HTTPS'=>'on'}
    

检查响应需要 Rspec

expect(response).to be_success
expect(response.status).to eq(200)
expect(response.body).to match(/some string in body/)
于 2013-08-31T06:28:20.667 回答