Set Rspec default GET request format to JSON

前端 未结 10 1833
失恋的感觉
失恋的感觉 2020-12-02 22:31

I am doing functional tests for my controllers with Rspec. I have set my default response format in my router to JSON, so every request without a suffix will return JSON.

相关标签:
10条回答
  • 2020-12-02 22:49

    Running Rails 5 and Rspec 3.5 I had to set the headers to accomplish this.

    post '/users', {'body' => 'params'}, {'ACCEPT' => 'application/json'}
    

    Thi matches what the example in the docs looks like:

    require "rails_helper"
    
    RSpec.describe "Widget management", :type => :request do
      it "creates a Widget" do
        headers = {
          "ACCEPT" => "application/json",     # This is what Rails 4 accepts
          "HTTP_ACCEPT" => "application/json" # This is what Rails 3 accepts
        }
        post "/widgets", { :widget => {:name => "My Widget"} }, headers
    
        expect(response.content_type).to eq("application/json")
        expect(response).to have_http_status(:created)
      end
    end
    
    0 讨论(0)
  • 2020-12-02 22:51
    before :each do
      request.env["HTTP_ACCEPT"] = 'application/json'
    end
    
    0 讨论(0)
  • 2020-12-02 22:51

    Per the Rspec docs, the supported method is through the headers:

    require "rails_helper"
    
    RSpec.describe "Widget management", :type => :request do
    
      it "creates a Widget" do
        headers = {
          "ACCEPT" => "application/json",      # This is what Rails 4 and 5 accepts
          "HTTP_ACCEPT" => "application/json", # This is what Rails 3 accepts
        }
        post "/widgets", :params => { :widget => {:name => "My Widget"} }, :headers => headers
    
        expect(response.content_type).to eq("application/json")
        expect(response).to have_http_status(:created)
      end
    
    end
    
    0 讨论(0)
  • 2020-12-02 22:52

    Perhaps you could add the first answer into spec/spec_helper or spec/rails_helper with this:

    config.before(:each) do
      request.env["HTTP_ACCEPT"] = 'application/json' if defined? request
    end
    

    if in model test (or any not exist request methods context), this code just ignore. it worked with rspec 3.1.7 and rails 4.1.0 it should be worked with all rails 4 version generally speaking.

    0 讨论(0)
  • 2020-12-02 22:54

    The following works for me with rspec 3:

    before :each do
      request.headers["accept"] = 'application/json'
    end
    

    This sets HTTP_ACCEPT.

    0 讨论(0)
  • 2020-12-02 22:55

    Why don't RSpec's methods, "get", "post", "put", "delete" work in a controller spec in a gem (or outside Rails)?

    Based off this question, you could try redefining process() in ActionController::TestCase from https://github.com/rails/rails/blob/32395899d7c97f69b508b7d7f9b7711f28586679/actionpack/lib/action_controller/test_case.rb.

    Here is my workaround though.

    describe FooController do
        let(:defaults) { {format: :json} }
    
        context 'GET index' do
            let(:params) { defaults }
            before :each do
                get :index, params
            end
    
            # ...
        end
    
        context 'POST create' do
            let(:params) { defaults.merge({ name: 'bar' }) }
            before :each do
                post :create, params
            end
    
            # ...
        end
    end
    
    0 讨论(0)
提交回复
热议问题