Ruby on rails 如何在rspec中打印响应正文
我正在尝试为meetings_controller.rb编写一个rspec文件,以检查从数据库返回的值是否正确 当我转到localhost:3000/meeting.json时,这是来自数据库的数据的结果 我的rspec文件正在尝试检查是否返回了正确的值 我在specs下创建了一个名为controller的文件夹(在我安装了rspec之后),并使文件满足_controller_spec.rbRuby on rails 如何在rspec中打印响应正文,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试为meetings_controller.rb编写一个rspec文件,以检查从数据库返回的值是否正确 当我转到localhost:3000/meeting.json时,这是来自数据库的数据的结果 我的rspec文件正在尝试检查是否返回了正确的值 我在specs下创建了一个名为controller的文件夹(在我安装了rspec之后),并使文件满足_controller_spec.rb require 'rails_helper' # Change this ArticlesContr
require 'rails_helper'
# Change this ArticlesController to your project
RSpec.describe MeetingsController, type: :controller do
describe "GET #index" do
# check index
it "returns a success response" do
get :index
puts response.body
expect(response).to have_http_status(:ok)
end
end
end
我试图打印响应正文,但没有任何结果。有办法做到这一点吗
(base) adam-a01:reservation adrianlee$ rspec
.
Finished in 0.0892 seconds (files took 12.15 seconds to load)
1 example, 0 failures
顺便说一句,这是我的会议
class MeetingsController < ApplicationController
before_action :set_meeting, only: [:show, :edit, :update, :destroy]
# GET /meetings
# GET /meetings.json
def index
@meetings = Meeting.all
@meeting = Meeting.new
end
end
这就是提出的错误
失败:
1) MeetingsController GET #index returns a success response
Failure/Error: raise response.body
RuntimeError:
# ./spec/controllers/meeting_controller_spec.rb:10:in `block (3 levels) in <top (required)>'
1)MeetingsController获取#索引返回成功响应
失败/错误:raise response.body
运行时错误:
#./spec/controllers/meeting_controller_spec.rb:10:in“block(3层)in”
如果为了调试目的而试图获取此值,则应使用byebug
或pry
gems
如果选择byebug,则将其添加到测试环境上的gem文件gem'byebug'
。
运行bundle install
,然后您就可以在测试中使用它了
因此,将put
替换为byebug
describe "GET #index" do
# check index
it "returns a success response" do
get :index
byebug
expect(response).to have_http_status(:ok)
end
end
在控制台上,现在您正好在那里。只需键入response.body
和enter
即可打印其值。
完成后,只需键入c
,然后输入enter
,即可释放控制台,继续测试
另外,有关使用byebug进行调试的详细信息,在我的例子中,我是这样做的:
require 'rails_helper'
describe SuppliersController, type: :controller do
describe 'GET /suppliers' do
let!(:access_token) { create :access_token }
let!(:admin_user_token) do
create :user_token, resource_owner: create(:admin_user)
end
context 'when the requester is an admin' do
it 'returns HTTP status 200 (OK)' do
allow(controller).to receive(:doorkeeper_token) { access_token }
@request.env['HTTP_X_USERTOKEN'] = admin_user_token.token
get :index
raise response.body.inspect ## Here is what prints the value in the console.
body = JSON.parse response.body
expect(response).to have_http_status :ok
expect(body['status']).to eq 'OK'
end
end
end
end
要运行测试,请执行以下操作:
rspec spec/controllers/suppliers/suppliers_controller_index_spec.rb
它给了我输出:
F
Failures:
1) SuppliersController GET /suppliers when the requester is an admin returns HTTP status 200 (OK)
Failure/Error: raise response.body.inspect
RuntimeError:
"{\"status\":\"OK\",\"message\":\"Your request has been processed successfully.\",\"data\":[],\"page\":{\"current_page\":1,\"prev_page\":null,\"next_page\":null,\"per_page\":25,\"total_pages\":0}}"
# ./spec/controllers/suppliers/suppliers_controller_index_spec.rb:17:in `block (4 levels) in <top (required)>'
Finished in 0.47594 seconds (files took 2.82 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/controllers/suppliers/suppliers_controller_index_spec.rb:11 # SuppliersController GET /suppliers when the requester is an admin returns HTTP status 200 (OK)
F
失败:
1) 当请求者是管理员时,SuppliersController获取/suppliers返回HTTP状态200(OK)
失败/错误:raise response.body.inspect
运行时错误:
“{\”状态\“:\”确定\“,”消息\“:\”您的请求已成功处理。\”,\“数据\“:[],\”页面\“:{\”当前页面\“:1,\”上一页\“:null,\”下一页\“:null,\”每页\“:25,\”总页面\“:0}”
#./spec/controller/suppliers/suppliers\u controller\u index\u spec.rb:17:in'block(4级)in'
完成时间为0.47594秒(加载文件需要2.82秒)
1例,1例失败
失败的示例:
rspec./spec/controllers/suppliers/suppliers\u controller\u index\u spec.rb:11#suppliers当请求者是管理员时,controller GET/suppliers返回HTTP状态200(OK)
我不得不说,引发运行时错误以检查变量值不是一个好的做法,也许您应该尝试@DR7建议的gem'pry'
或gem'byebug'
。
您需要确保的另一件事是您是否在不同的环境中运行了
rails s
和rspec
?这可能会导致它们连接到单独的数据库。这是否回答了您的问题?我也试过了,但实际上不起作用。编辑我的回答您是否尝试获取此值用于调试?为什么不在其中放置断点并检查响应。答案是0.body吗?状态代码是什么?我正在使用提升响应.body.inspect
。但这会给测试用例一个错误,因为它会引发运行时错误,但我可以在控制台中看到该值。
F
Failures:
1) SuppliersController GET /suppliers when the requester is an admin returns HTTP status 200 (OK)
Failure/Error: raise response.body.inspect
RuntimeError:
"{\"status\":\"OK\",\"message\":\"Your request has been processed successfully.\",\"data\":[],\"page\":{\"current_page\":1,\"prev_page\":null,\"next_page\":null,\"per_page\":25,\"total_pages\":0}}"
# ./spec/controllers/suppliers/suppliers_controller_index_spec.rb:17:in `block (4 levels) in <top (required)>'
Finished in 0.47594 seconds (files took 2.82 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/controllers/suppliers/suppliers_controller_index_spec.rb:11 # SuppliersController GET /suppliers when the requester is an admin returns HTTP status 200 (OK)