Подтвердить что ты не робот

Объект сеанса 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, который содержит строку "купон", и тест терпит неудачу.

4b9b3361

Ответ 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]