Невозможно передать переменные сеанса в контроллер RSpec - PullRequest
1 голос
/ 29 апреля 2019

Я тестирую метод подтверждения из контроллера, использующего RSpec, похоже, что тесты давят, потому что я не могу передать переменные сеанса при обращении к методу.

Вот моя спецификация:

RSpec.describe OauthCallbacksController, type: :controller do
  describe 'POST #confirm_email' do
    before do
      request.env["devise.mapping"] = Devise.mappings[:user]
    end

    context 'confirms_email' do
      let(:email) { 'test-email@test.ru' }
      let(:confirm_email) { post :confirm_email, params: { email: email }, session: { auth: { uid: '12345', provider: 'facebook' } } }

      it 'redirects to new_user_session_path' do
        confirm_email
        expect(response).to redirect_to new_user_session_path
      end

      it 'sends an email' do
        expect { confirm_email }.to change{ ActionMailer::Base.deliveries.count }.by(1)
      end
    end
  end
end

Метод verify_email:

def confirm_email
    puts params[:email]
    pending_user = User.find_or_init_skip_confirmation(params[:email])
    if pending_user
      aut = Authorization.where(provider: session[:auth]['provider'], uid: session[:auth]['uid'], linked_email: params[:email])
                         .first_or_initialize do |auth|
        auth.user = pending_user
        auth.confirmation_token = Devise.friendly_token[0, 20],
        auth.confirmation_sent_at = Time.now.utc
      end

      if aut.save
        OauthMailer.send_confirmation_letter(aut).deliver_now
        redirect_to root_path, notice: "Great! Now confirm your email, we've sent you a letter!"
      else
        redirect_to root_path, alert: "Something went wrong. Please try again later or use another sign in method"
      end
    end
  end

Когда я пытаюсь отобразить переменные сеанса, они nil, в test.log очевидно, что переменные сеанса должны быть NULL-s.

[34mВЫБРАТЬ "полномочия". * ИЗ "полномочий" ГДЕ "полномочия". "Поставщик" НЕДЕЙСТВИТЕЛЕН И "полномочия". "Uid" НУЛЕВО И "полномочия". "Connected_email" = $ 1 ЗАКАЗАТЬ ПО "полномочиям"."id" ASC LIMIT $ 2 [0m [["connected_email", "test-email@test.ru"], ["LIMIT", 1]]

Я использую Rails 5.2.2.1 и RSpec3.8.

Я читал, что в Rails 5 есть проблема с доступом к сеансам, я уже пытался установить его с controller.session[:auth]['uid'] или request.session[:auth]['uid'], но ничего

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Мне удалось передать параметры сеанса, используя request.env["omniauth.auth"] = mock_auth_hash(:facebook), и когда вместо передачи хеша я передал запрос сеансу.Это сделало работу.Теперь моя спецификация выглядит следующим образом.

  describe 'POST #confirm_email' do
    before do
      request.env["devise.mapping"] = Devise.mappings[:user]
      request.env["omniauth.auth"] = mock_auth_hash(:facebook)
      get :facebook
    end

    let(:confirm_email) { post :confirm_email, params: { email: 'mockuser@test.com'}, session: { auth: request.env["omniauth.auth"] } }

    it 'redirects to root_path' do
      confirm_email
      expect(response).to redirect_to root_path
    end

    it 'sends an email' do
      request.env["devise.mapping"] = Devise.mappings[:user]
      request.env["omniauth.auth"] = mock_auth_hash(:facebook)
      get :facebook

      expect { confirm_email }.to change{ ActionMailer::Base.deliveries.count }.by(1)
    end
  end
0 голосов
/ 30 апреля 2019

Что-то странное происходит в рельсах или стойке, но во вложенном сеансе ключи доступны в виде символов.Это должно работать

Authorization.where(provider: session[:auth][:provider], uid: session[:auth][:uid], linked_email: params[:email])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...