`get` API 请求的 Rspec 测试中出现 `expected 200` 错误

`expected 200` error in Rspec test for `get` API request

我正在尝试编写一些 rspec 测试来检查仅 API 应用程序的 API 端点。

测试错误

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

但是,如果从另一个应用程序发出相同的调用(具有完整的 api url),它工作正常并且 returns 响应。

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

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

我尝试遵循的博客示例: (http://matthewlehner.net/rails-api-testing-guidelines/).

# 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

我没有太多测试经验,所以如果有人能指出正确的方向,我将非常感激。

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

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

在 Rspec 请求测试中,response 是通过调用 get 自动设置的,无需您执行任何额外操作。