在`get` API请求的Rspec测试中出现'预期200'错误

时间:2016-05-29 10:02:08

标签: ruby-on-rails rspec endpoint

我正在尝试编写一些rspec测试来检查API端点是否仅适用于API。

测试错误

Failure/Error: expect( res ).to be_success
       expected 200 to respond to `success?`

但是,如果从另一个应用程序进行相同的调用(使用完整的api url),它可以正常工作并返回响应。

来自其他应用程序的示例:

res = RestClient.get "site.io/api/v1/projects/1"
p JSON.parse(res)

博客示例我试图关注:NotificationCompat.Builder)。

# spec/requests/api/v1/messages_spec.rb
describe "Messages API" do
  it 'sends a list of messages' do
    FactoryGirl.create_list(:message, 10)

    get '/api/v1/messages'

    json = JSON.parse(response.body)

    # test for the 200 status-code
    expect(response).to be_success

    # check to make sure the right amount of messages are returned
    expect(json['messages'].length).to eq(10)
  end
end

我的申请

/requests/projects_spec.rb

require 'rails_helper'
RSpec.describe Project do
  describe "show_project" do

      before do
          @project1 = create(:project)
      end

      it "Checks if responds successfully" do
        res = get '/api/v1/projects/1'
        expect( res ).to be_success
      end
  end
end

/factories/projects.rb

FactoryGirl.define do
  factory :project do
    name "Thing"
    key "123123"
  end
end

的routes.rb

namespace :api, :defaults => { :format => 'json'} do
    namespace :v1 do
      resources :projects, only: [:create, :show]
      end
    end
end

我没有多少测试经验,所以如果有人能指出我正确的方向,我真的很感激。

1 个答案:

答案 0 :(得分:1)

使用Rspec请求规范时,您的get '/api/v1/projects/1'变量不需要捕获res。运行response时,Spec Request测试会自动设置get '/api/v1/projects/1'的值。你所遵循的例子是正确的,它只是看起来你缺少一些关于Rspec在幕后为你处理多少的知识。这使您的测试更简单:

it "Checks if responds successfully" do
  get '/api/v1/projects/1'
  expect(response).to be_success
end

在Rspec请求测试中,response会自动设置get,而无需您执行任何额外操作。