RSpec在请求后发送原始JSON参数

问题描述 投票:0回答:1

所以我正在尝试测试一个帖子请求,以便保存一些书籍细节。响应来自原始JSON,因为它使用formData在客户端中进行字符串化。这样我就可以在控制器中适当地格式化响应。我找不到任何明确的方式来发送原始JSON参数,因为rails会自动将这些参数强制为HASH。有什么建议吗? Rails 5.1.4 Rspec 3.7.2

books_spec.rb

# Test suite for POST /books
  describe 'POST /books' do
    # valid payload
    let(:valid_attributes) do
      # send stringify json payload
      { 
        "title": "Learn Elm", 
        "description": "Some good", 
        "price": 10.20, 
        "released_on": Time.now,
        "user_id": user.id,
        "image": "example.jpg"
      }.to_json
    end

    # no implicit conversion of ActiveSupport::HashWithIndifferentAccess into String

    context 'when the request is valid' do
      before { post '/books', params: valid_attributes, headers: headers }

      it 'creates a books' do
        expect(json['book']['title']).to eq('Learn Elm')
      end

      it 'returns status code 201' do
        expect(response).to have_http_status(201)
      end
    end

    context 'when the request is invalid' do
      let(:valid_attributes) { { title: nil, description: nil }.to_json }
      before { post '/books', params: valid_attributes, headers: headers }

      it 'returns status code 422' do
        expect(response).to have_http_status(422)
      end

      it 'returns a validation failure message' do
        expect(response.body)
          .to match(/Validation failed: Title can't be blank, Description can't be blank/)
      end
    end
  end

books_controller.rb

# POST /books
def create
  @book = current_user.books.create!(book_params)
  render json: @book, status: :created
end

def book_params
  binding.pry # request.params[:book] = HASH
  parsed = JSON.parse(request.params[:book])
  params = ActionController::Parameters.new(parsed)
  params['image'] = request.params[:image]
  params.permit(
   :title, 
   :description, 
   :image, 
   :price, 
   :released_on, 
   :user
  )
end
ruby-on-rails rspec rspec-rails
1个回答
0
投票
 #you should try test the request first like this and if you see this helping you I will send you the 200 test

describe "#create" do
  context "when the request format is not json" do

    let(:error_message) do
      { "Invalid Request Format" => "Request format should be json" }
    end

    before do
      post :create, headers: { "CONTENT_TYPE": "XML" }
    end

    it "should return a status of 400" do
      expect(response).to have_http_status(400)
    end

    it "should return an invalid request format in the body" do
      expect(json(response.body)).to eql error_message
    end
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.