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.
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.
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.
Vous pouvez également utiliser un objet @request comme
@request.session['coupon'] = 'abcd'
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]