web-dev-qa-db-fra.com

Objet de session set RSpec

J'essaie de définir un objet de session à partir de mes spécifications de contrôleur.

it 'use invalid coupon' do
  session[:coupon] = 'abcd'      
  Service.any_instance.stub(:validate_coupon).with(session[:coupon]).and_return('abcd')

  get :index
  expect(flash[:coupon__notice]).to be nil
end

mais lorsque j'inspecte la session, au lieu d'un objet @coupon, j'obtiens un @data qui contient la chaîne "coupon" et le test échoue.

31
parov

Ceci est expliqué dans le Guide to Testing Rails Applications in section 4 "Functional Tests for your Controllers. The get action takes a params hash et un hachage de session, par exemple:

get(:show, {'id' => "12"}, {'user_id' => 5})

Vous devriez pouvoir passer nil pour le hachage params dans votre exemple, puis passer les paramètres de session souhaités:

get :index, nil, {coupon: 'abcd'}

Je recommande une lecture approfondie du guide Rails pour tous ceux qui utilisent RSpec pour Rails testing. rspec-Rails exploite les classes de test existantes Rails, un point qui n'est pas très clair dans le rspec-Rails documents.

54
zetetic

Dans Rails 5+, si vous utilisez ActionController::TestCase la session est passée en tant que mot clé arg.

La définition des paramètres et de la session ressemblerait à ceci:

get(:show, params: {'id' => "12"}, session: {'user_id' => 5})

Définir uniquement la session ressemblerait,

get(:show, session: {'user_id' => 5})

Si vous utilisez ActionDispatch::IntegrationTest, qui est la nouvelle valeur par défaut pour les tests de contrôleur, vous êtes pas capable de définir les variables de session et devez les définir en parcourant votre test à travers le flux de connexion.

37
HParker

Vous pouvez également utiliser un objet @request comme

@request.session['coupon'] = 'abcd'
15
Vignesh Jayavel

Vous pouvez également faire:

request_params = { city: 'Bomet', code: '023' }
session_params = { taxes_paid: 'No' }

Ensuite, dans votre spécification, vous pouvez faire:

get :edit, request_params, session_params

Dans votre fonctionnalité, vous pouvez accéder à votre session avec session[:taxes_paid]

0
Ruto Collins