我正在尝试编写一些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
我没有多少测试经验,所以如果有人能指出我正确的方向,我真的很感激。
答案 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
,而无需您执行任何额外操作。