RSpec 抛出奇怪的错误文本
RSpec throws weird fault text
我想用 RSpec 测试我的 boards_controller。我陷入了对 JSON 响应的平等验证。
这里很简单boards_controller_spec.rb
require "rails_helper"
RSpec.describe Api::V1::BoardsController, type: :request do
context "#index" do
it "must return data" do
get "/api/v1/boards"
expect(response.body).to include_json(
data: [
id: (should be_kind_of Integer),
link: (should be_kind_of String),
],
)
end
end
end
这是我的 boards_controller.rb
,只有 #index
和 #show
方法。
module Api::V1
class BoardsController < ApplicationController
def index
@boards = Board.all
render json: @boards
end
def show
@board = Board.find(params[:id])
render json: @board
end
private
def set_board
@board = Board.find(params[:id])
end
def board_params
params.require(:board).permit(:link)
end
end
end
在 host:3000/api/v1/boards 页面上我有这个 JSON 回复:
[
{
"id": 1,
"link": "mzdbQBiKYk",
"created_at": "2020-03-23T21:29:14.335Z",
"updated_at": "2020-03-23T21:29:14.335Z"
},
{
"id": 2,
"link": "ZkbspsYIPz",
"created_at": "2020-03-23T21:29:14.347Z",
"updated_at": "2020-03-23T21:29:14.347Z"
}
]
所以我的目标是检查 id 是否为整数且 link 是否为字符串,但是当我尝试 运行 测试时出现此错误:
Failures:
1) Api::V1::BoardsController#index must return data
Failure/Error: id: (should be_kind_of Integer),
expected #<Api::V1::BoardsController:0x0000561c114a6e28 @_routes=nil, @_request=nil, @_response=nil> to be a kind of Integer
# ./spec/requests/boards_controller_spec.rb:9:in `block (3 levels) in <top (required)>'
这是怎么回事? Boards 是用种子创建的(仅为 boards 随机生成 links),因为我不需要为此模型创建方法。
includes_json
匹配器用于匹配JSON的实际值。
RSpec.describe Api::V1::BoardsController, type: :request do
context "#index" do
it "must return data" do
get "/api/v1/boards"
expect(response.body).to include_json(
data: [
id: 1,
link: "mzdbQBiKYk"
]
)
end
end
end
检查您在测试设置阶段设置的记录值,或者如果您使用的是那些垃圾,请检查您的设备。
如果你想检查类型你需要手动遍历 JSON:
RSpec.describe Api::V1::BoardsController, type: :request do
let(:json) { JSON.parse(response.body) }
context "#index" do
it "must return data" do
get "/api/v1/boards"
expect(json["data"].first["id"]).to be_kind_of Integer
end
end
end
但这并不是一个很好的测试,因为您可以实际测试它是否包含正确的数据。
此外,您还有一个奇怪的控制器规格和 request spec 组合。请求规范应如下所示:
RSpec.describe 'Boards API V1', type: :request do
describe "GET /api/v1/boards" do
let!(:boards) do
# @todo setup data for the test
end
it "must return data" do
get "/api/v1/boards"
expect(response.body).to include_json(
data: [
id: boards.first.id
link: boards.first.link
]
)
end
end
end
一个好的请求规范描述了您正在测试的 HTTP 端点。不是底层控制器。
我想用 RSpec 测试我的 boards_controller。我陷入了对 JSON 响应的平等验证。
这里很简单boards_controller_spec.rb
require "rails_helper"
RSpec.describe Api::V1::BoardsController, type: :request do
context "#index" do
it "must return data" do
get "/api/v1/boards"
expect(response.body).to include_json(
data: [
id: (should be_kind_of Integer),
link: (should be_kind_of String),
],
)
end
end
end
这是我的 boards_controller.rb
,只有 #index
和 #show
方法。
module Api::V1
class BoardsController < ApplicationController
def index
@boards = Board.all
render json: @boards
end
def show
@board = Board.find(params[:id])
render json: @board
end
private
def set_board
@board = Board.find(params[:id])
end
def board_params
params.require(:board).permit(:link)
end
end
end
在 host:3000/api/v1/boards 页面上我有这个 JSON 回复:
[
{
"id": 1,
"link": "mzdbQBiKYk",
"created_at": "2020-03-23T21:29:14.335Z",
"updated_at": "2020-03-23T21:29:14.335Z"
},
{
"id": 2,
"link": "ZkbspsYIPz",
"created_at": "2020-03-23T21:29:14.347Z",
"updated_at": "2020-03-23T21:29:14.347Z"
}
]
所以我的目标是检查 id 是否为整数且 link 是否为字符串,但是当我尝试 运行 测试时出现此错误:
Failures:
1) Api::V1::BoardsController#index must return data
Failure/Error: id: (should be_kind_of Integer),
expected #<Api::V1::BoardsController:0x0000561c114a6e28 @_routes=nil, @_request=nil, @_response=nil> to be a kind of Integer
# ./spec/requests/boards_controller_spec.rb:9:in `block (3 levels) in <top (required)>'
这是怎么回事? Boards 是用种子创建的(仅为 boards 随机生成 links),因为我不需要为此模型创建方法。
includes_json
匹配器用于匹配JSON的实际值。
RSpec.describe Api::V1::BoardsController, type: :request do
context "#index" do
it "must return data" do
get "/api/v1/boards"
expect(response.body).to include_json(
data: [
id: 1,
link: "mzdbQBiKYk"
]
)
end
end
end
检查您在测试设置阶段设置的记录值,或者如果您使用的是那些垃圾,请检查您的设备。
如果你想检查类型你需要手动遍历 JSON:
RSpec.describe Api::V1::BoardsController, type: :request do
let(:json) { JSON.parse(response.body) }
context "#index" do
it "must return data" do
get "/api/v1/boards"
expect(json["data"].first["id"]).to be_kind_of Integer
end
end
end
但这并不是一个很好的测试,因为您可以实际测试它是否包含正确的数据。 此外,您还有一个奇怪的控制器规格和 request spec 组合。请求规范应如下所示:
RSpec.describe 'Boards API V1', type: :request do
describe "GET /api/v1/boards" do
let!(:boards) do
# @todo setup data for the test
end
it "must return data" do
get "/api/v1/boards"
expect(response.body).to include_json(
data: [
id: boards.first.id
link: boards.first.link
]
)
end
end
end
一个好的请求规范描述了您正在测试的 HTTP 端点。不是底层控制器。