RSpec 在一个相当简单的 get 请求中返回空字符串

时间:2021-01-18 19:43:41

标签: ruby-on-rails ruby rspec

我想在 Shipment 控制器中测试显示操作。为此,我准备了相当简单的规格:

RSpec.describe ShipmentsController, type: :controller do
  describe 'GET #show' do
    let(:params) { { id: shipment.id, product_id: product.id } }
    let!(:product) { create(:product) }
    let!(:shipment) { create(:shipment, product: product) }

    context 'when params are valid' do
      before { get :show, params: params }

      it 'return valid json' do
        expect(JSON.parse(response.body)).to eq(expected_json)
      end
    end
  end
end

ShimpentsController.rb

class ShipmentsController < ApplicationController
  before_action :set_product

  attr_reader :shipment

  def show
    @shipment = Shipment.find(params[:id])
    @items = shipment&.grouped_shipment_items
  end

  private

  def set_product
    @product = Product.find(params[:product_id])
  end
end

当我使用邮递员时一切顺利 - 它返回预期的 json 但在 RSpec 测试中我得到:

response.body
=> ""

2 个答案:

答案 0 :(得分:1)

我认为您需要在控制器规范文件中添加 render_views

RSpec.describe ShipmentsController, type: :controller do
  render_views

  describe 'GET #show' do
    let(:params) { { id: shipment.id, product_id: product.id } }
    let!(:product) { create(:product) }
    let!(:shipment) { create(:shipment, product: product) }

    context 'when params are valid' do
      before { get :show, params: params }

      it 'return valid json' do
        expect(JSON.parse(response.body)).to eq(expected_json)
      end
    end
  end
end

参考:https://rubyinrails.com/2019/04/11/rails-test-jbuilder-json-response-with-rspec/

答案 1 :(得分:0)

我认为您没有使用 rspec 请求 JSON 响应。您可以通过在控制器操作中放置一个断点来检查,然后检查

request.format.json?

为了从 rspec 测试中请求 JSON 响应,您应该将 as: :json 添加到请求的末尾。请求应如下所示:

get :show, params: params, as: :json
相关问题