52

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.

Now in rspec, i get an error (406) when i try

get :index

I need to do

get :index, :format => :json

Now because i am primarily supporting JSON with my API, it is very redundant having to specify the JSON format for every request.

Can i somehow set it to default for all my GET requests? (or all requests)

4

11 に答える 11

56
before :each do
  request.env["HTTP_ACCEPT"] = 'application/json'
end
于 2013-05-05T08:02:49.640 に答える
25

これを入れてくださいspec/support

require 'active_support/concern'

module DefaultParams
  extend ActiveSupport::Concern

  def process_with_default_params(action, parameters, session, flash, method)
    process_without_default_params(action, default_params.merge(parameters || {}), session, flash, method)
  end

  included do
    let(:default_params) { {} }
    alias_method_chain :process, :default_params
  end
end

RSpec.configure do |config|
  config.include(DefaultParams, :type => :controller)
end

そして、単にオーバーライドしますdefault_params

describe FooController do
    let(:default_params) { {format: :json} }
    ...
end
于 2013-01-31T10:50:32.573 に答える
20

以下はrspec 3で動作します:

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

これにより、 が設定されますHTTP_ACCEPT

于 2015-01-15T16:57:05.807 に答える
7

RSpec 3 では、ビューをレンダリングするために、JSON テストをリクエスト仕様にする必要があります。これが私が使用するものです:

# spec/requests/companies_spec.rb
require 'rails_helper'

RSpec.describe "Companies", :type => :request do
  let(:valid_session) { {} }

  describe "JSON" do
    it "serves multiple companies as JSON" do
      FactoryGirl.create_list(:company, 3)
      get 'companies', { :format => :json }, valid_session
      expect(response.status).to be(200)
      expect(JSON.parse(response.body).length).to eq(3) 
    end

    it "serves JSON with correct name field" do
      company = FactoryGirl.create(:company, name: "Jane Doe")
      get 'companies/' + company.to_param, { :format => :json }, valid_session
      expect(response.status).to be(200)
      expect(JSON.parse(response.body)['name']).to eq("Jane Doe")
    end
  end
end

すべてのテストでフォーマットを設定することに関しては、この他の回答からのアプローチが好きです: https://stackoverflow.com/a/14623960/1935918

于 2014-07-30T17:58:42.043 に答える
-3

RSpecのメソッド「get」、「post」、「put」、「delete」がgem(またはRailsの外部)のコントローラー仕様で機能しないのはなぜですか?

この質問に基づいて、https://github.com/rails/rails/blob/32395899d7c97f69b508b7d7f9b7711f28586679/actionpack/lib/action_controller/test_case.rbのActionController :: TestCaseでprocess()を再定義してみてください。

ただし、これが私の回避策です。

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
于 2012-07-20T17:06:57.477 に答える