Объект сеанса RSpec
Я пытаюсь установить объект сеанса из спецификации моего контроллера.
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
но когда я проверяю сеанс, вместо объекта @coupon, я получаю @data, который содержит строку "купон", и тест терпит неудачу.
Ответы
Ответ 1
Это объясняется в Руководство по тестированию Rails-приложений в разделе 4 "Функциональные тесты для ваших контроллеров". Действие get
принимает параметры хэш и хэш сеанса, например:
get(:show, {'id' => "12"}, {'user_id' => 5})
Вы должны иметь возможность передать nil
для хэша params в вашем примере, а затем передать требуемые параметры сеанса:
get :index, nil, {coupon: 'abcd'}
Я рекомендую внимательно прочитать руководство Rails для всех, кто использует RSpec для тестирования Rails. rspec-rails
использует существующие тестовые классы Rails, точка, которая не очень понятна в документах rspec-rails
.
Ответ 2
В Rails 5+, если вы используете ActionController::TestCase
, сеанс передается как ключевое слово arg.
Настройка параметров и сеанса будет выглядеть так:
get(:show, params: {'id' => "12"}, session: {'user_id' => 5})
Настройка только сеанса будет выглядеть так:
get(:show, session: {'user_id' => 5})
Если вы используете ActionDispatch::IntegrationTest
, который является новым по умолчанию для тестов контроллера, вы не можете установить переменные сеанса и должны установить их, пройдя свой тест через поток входа.
Ответ 3
Вы также можете использовать объект @request, например
@request.session['coupon'] = 'abcd'
Ответ 4
Вы также можете сделать:
request_params = { city: 'Bomet', code: '023' }
session_params = { taxes_paid: 'No' }
Тогда в вашей спецификации вы можете сделать:
get :edit, request_params, session_params
В вашей функциональности вы можете получить доступ к вашему сеансу с session[:taxes_paid]