52 votes

Définir le format de demande GET par défaut Rspec sur JSON

Je suis en train de faire des tests fonctionnels pour mon contrôleurs avec Rspec. J'ai réglé mon défaut format de la réponse dans mon routeur en JSON, de sorte que chaque demande sans suffixe sera de retour JSON.

Maintenant dans rspec, j'obtiens une erreur (406) lorsque j'essaie

get :index

J'ai besoin de faire

get :index, :format => :json

Maintenant, parce que je suis le principal soutien de JSON avec mon API, il est très redondant d'avoir à spécifier le format JSON pour chaque demande.

Je peux en quelque sorte mis à défaut pour toutes mes demandes? (ou toutes les demandes)

56voto

Pratik Khadloya Points 3481
before :each do
  request.env["HTTP_ACCEPT"] = 'application/json'
end

25voto

knoopx Points 3607

Mettez ceci en 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
 

Et puis remplacez simplement default_params :

 describe FooController do
    let(:default_params) { {format: :json} }
    ...
end
 

7voto

dankohn Points 6999

Dans RSpec 3, vous devez faire en sorte que les tests JSON soient des spécifications de demande afin que les vues soient rendues. Voici ce que j'utilise:

 # 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
 

Quant à la définition du format sur tous les tests, j'aime l'approche de cette autre réponse: http://stackoverflow.com/a/14623960/1935918

6voto

zw963 Points 11

Vous pourriez peut-être ajouter la première réponse dans spec / spec_helper ou spec / rails_helper avec ceci:

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

s'il est dans le test de modèle (ou dans un contexte de méthodes de demande qui n'existe pas), ce code ignore simplement. il a fonctionné avec rspec 3.1.7 et rails 4.1.0 il devrait être utilisé avec toutes les versions de rails 4 en général.

-3voto

Kenneth Cheng Points 306

Pourquoi ne pas RSpec de méthodes "get", "post", "mettre", "supprimer" travailler dans un contrôleur de spec dans un bijou (ou à l'extérieur des Rails)?

Basé sur cette question, vous pourriez essayer de redéfinition des processus de() en ActionController::cas de test à partir de https://github.com/rails/rails/blob/32395899d7c97f69b508b7d7f9b7711f28586679/actionpack/lib/action_controller/test_case.rb.

Voici ma solution de contournement si.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X