RSpe c выдает странный текст ошибки - PullRequest
0 голосов
/ 26 марта 2020

Я хочу проверить свой board_controller с RSpe c. Я застрял в равной проверке ответа 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

На хосте: Страница 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 является целым числом, а ссылка является строкой, но когда я пытаюсь запустить тест, у меня это ошибка:

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)>'

Что здесь не так? Доски были созданы с помощью seed (генерируются только случайные ссылки для досок), потому что мне не нужен метод create для этой модели.

1 Ответ

1 голос
/ 26 марта 2020

Сопоставитель 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

Но это не очень хороший тест как вы можете на самом деле проверить, что он содержит правильные данные вместо этого. Также у вас есть странная комбинация unidiomati c контроллера spe c и запроса spe c. Спецификация запроса c должна выглядеть следующим образом:

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

Хорошая спецификация запроса c описывает конечные точки HTTP, которые вы тестируете. Не основной контроллер.

...