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

RSpec returns empty string in a fairly simple get request

我想在我的 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

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

response.body
=> ""

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

request.format.json?

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

get :show, params: params, as: :json

我认为您需要在控制器规范文件中添加 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/