【问题标题】:RSpec returns empty string in a fairly simple get requestRSpec 在一个相当简单的 get 请求中返回空字符串
【发布时间】:2021-01-18 19:43:41
【问题描述】:

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

【问题讨论】:

  • 你用什么来返回json? jbuilder?
  • 您是否尝试过在调试模式下运行 rspec 来检查值。默认情况下,rails 操作将返回 HTML,除非指定返回 json。我在这里没有看到那个代码,你能详细说明一下吗
  • @Clara 是的,我正在使用 jbuilder 返回 json
  • 除非这是遗留代码,否则您真的应该编写请求规范。 rails 和 RSpec 团队都不鼓励使用控制器规范。 relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec

标签: ruby-on-rails ruby rspec


【解决方案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/

【讨论】:

    【解决方案2】:

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

    request.format.json?
    

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    相关资源
    最近更新 更多