Спецификация контроллера RSpec: Как проверить визуализированный JSON? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь протестировать действие простого контроллера в Rails API

Вот этот контроллер, о котором идет речь:

class Api::TransactionsController < ApplicationController
  def index
    transactions = Transaction.all
    json = TransactionSerializer.render(transactions)
    render json: json
  end
end

Вот мои спецификации на данный момент

require 'rails_helper'

RSpec.describe Api::TransactionsController do
  describe '.index' do
    context "when there's no transactions in the database" do
      let(:serialized_data) { [].to_json }

      before { allow(TransactionSerializer).to receive(:render).with([]).and_return(serialized_data) }
      after { get :index }

      specify { expect(TransactionSerializer).to receive(:render).with([]) }
      specify { expect(response).to have_http_status(200) }
    end
  end
end

Я хочу проверить ответ.Что-то вроде этого вопроса о переполнении стека Как проверить ответ JSON с помощью RSpec? :

specify { expect(response.body).to eq([].to_json) }

Моя проблема в том, что response.body - пустая строка,Это почему ?

1 Ответ

0 голосов
/ 28 декабря 2018

Не уверен, какой сериализатор вы используете.Но render не является методом для ActiveModel::Serializer.Попробуйте вместо этого:

module Api
  class TransactionsController < ApplicationController
    def index
      transactions = Transaction.all
      render json: transactions
    end
  end
end

Если ваш TransactionSerializer является ActiveModel::Serializer, Rails, как правило, просто использует его для сериализации каждой записи транзакции в ActiveRecord::Relation.

И проверьте это следующим образом:

require 'rails_helper'

describe Api::TransactionsController do
  describe '#index' do
    context "when there's no transactions in the database" do
      let(:transactions) { Transaction.none }

      before do
        allow(Transaction).to receive(:all).and_return(transactions)

        get :index
      end

      specify { expect(response).to have_http_status(200) }
      specify { expect(JSON.parse(response.body)).to eq([]) }
    end
  end
end

Часть проблемы здесь, возможно, заключалась в том, что вы на самом деле не вызывали get :index до тех пор, пока after тесты не запустились.Вам нужно позвонить до запуска тестов.

...