Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RSpec中用于模拟请求各个方面的钩子在哪里?_Ruby On Rails_Rspec_Ruby On Rails 3.2_Integration Testing_Rspec Rails - Fatal编程技术网

Ruby on rails RSpec中用于模拟请求各个方面的钩子在哪里?

Ruby on rails RSpec中用于模拟请求各个方面的钩子在哪里?,ruby-on-rails,rspec,ruby-on-rails-3.2,integration-testing,rspec-rails,Ruby On Rails,Rspec,Ruby On Rails 3.2,Integration Testing,Rspec Rails,我对RSpec很陌生。我正在为我们在Rails中制作的RESTAPI编写一个测试。API由一个操作组成,其将接受的请求规范如下: 只有在以下情况下,才会接受请求: 它是使用HTTPS制作的 它作为POST请求发送 它与以下参数一起发送:值\名称、值、项\ id 例如,有效的请求是: 该规范规定,如果发送满足这些要求的请求,服务器将使用200代码进行响应。如果发送的请求不符合这些要求,服务器将以400代码响应 根据这些要求,我想编写RSpec测试,以确保根据请求是否满足以下条件,使用正确的代码

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

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

  • 它是使用HTTPS制作的
  • 它作为POST请求发送
  • 它与以下参数一起发送:值\名称、值、项\ id
例如,有效的请求是:

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

根据这些要求,我想编写RSpec测试,以确保根据请求是否满足以下条件,使用正确的代码响应操作:

  • 使用HTTP/SSL发送
  • 使用
    POST
    或其他请求类型发送
  • 具有正确的参数
这是psuedo 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中的适当挂钩是什么:

  • 冒充请求
  • 指示请求应该或不应该通过HTTPS/SSL“发送”
  • 指示应将哪些参数发送到服务器
  • 模拟通过POST发送请求
  • 检查服务器的响应代码是什么
  • 我们使用的是Rails 3.2.13和Ruby 1.8.7(这是我们正在维护的一个较旧的应用程序)。我们的档案有

    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
    

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

    • 它是使用HTTPS制作的

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

      post test_path, {foo: 'bar', fff: 'bbb'}
      
    • 它与以下参数一起发送:HTTPS中的value\u name、value、item\u id

      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/)
    

    如果我花足够长的时间去探索,我可能会找到所有这些问题的答案。不过,我对RSpec还是很陌生,我很难找到既能回答我的问题又能让我充分了解他们所说内容的介绍性文章。如果你不给我一个直接的答案,但给我指出可以帮助我的资源方向,我也会很感激。我们的团队已经在使用RSpec进行其他测试,这就是我想使用它的原因。RSpec中的同一个测试除了最后的断言之外是否会使用相同的代码?@Kevin,前一部分是Rails的一部分,可以在RSpec中用于测试控制器而不会出现任何问题。后一部分属于Rspec。您可能不熟悉
    expect
    ,它只是另一种期望样式,类似于
    should
    。在大多数情况下,它们可以互换使用,这是有道理的。回到办公室后,我会试试你的答案,等我的答案发挥作用后再接受它=)
    expect(response).to be_success
    expect(response.status).to eq(200)
    expect(response.body).to match(/some string in body/)