Rails rspec и omniauth (интеграционное тестирование) - PullRequest
8 голосов
/ 16 марта 2012

Приложение My Rails 3.2 использует OmniAuth и Devise для входа в Twitter. Система аутентификации работает нормально. Я хотел бы написать интеграционный тест в rspec, чтобы убедиться, что все работает. Используя информацию в вики, я написал следующее, но я знаю, что мне чего-то не хватает.

Под test.rb в config / средах у меня есть следующие строки

OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[:twitter] = {:provider => 'twitter', :uid => '123545'}

Мой тест rspec выглядит так:

describe "Authentications" do
  context "without signing into app" do

    it "twitter sign in button should lead to twitter authentication page" do
      visit root_path
      click_link "Sign in with Twitter"
      Authentication.last.uid.should == '123545'
    end

  end
end

Аутентификация - это имя моей модели, и вызов .uid в консоли rails возвращает строку отлично.

Я получаю следующую ошибку при запуске этого теста:

Failure/Error: Authentication.last.uid.should == '123545'
NoMethodError:
undefined method `uid' for nil:NilClass

Может кто-нибудь помочь мне разобраться, как использовать предоставленные макеты OmniAuth? Объяснение почему и как это работает, также будет оценено.

Ответы [ 4 ]

14 голосов
/ 05 апреля 2012

Я сталкиваюсь с чем-то похожим.

После того, как я изменил мой макет объекта с помощью символьных клавиш:

OmniAuth.config.mock_auth[:twitter] = {
    :uid => '1337',
    :provider => 'twitter',
    :info => {
      :name => 'JonnieHallman'
    }
  }

для использования строковых ключей:

OmniAuth.config.mock_auth[:twitter] = {
    'uid' => '1337',
    'provider' => 'twitter',
    'info' => {
      'name' => 'JonnieHallman'
    }
  }

это сработало.

А у вас есть

  request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter] 

где-нибудь в вашем тестовом примере?

6 голосов
/ 29 марта 2012

Вы пытались переместить эти две строки в spec_helper.rb?

OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[:twitter] = {:provider => 'twitter', :uid => '123545'}

Также добавьте следующее перед блоком в ваш тестовый файл:

before do 
    request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter] 
end

Вы можете найти больше информации по этой ссылке: https://github.com/intridea/omniauth/wiki/Integration-Testing

1 голос
/ 24 сентября 2015

Я настоятельно рекомендую этот ответ

Короче ...

  • Настройка макета
  • Сделать запрос
  • Проверьте любой код, прикрепленный к обратному вызову

Например: проверить сеанс ['uid'] был установлен (хотя я предпочитаю проверять только то, что видит пользователь, или, скорее, не видит)

Мой код ...

конфигурации / среда / test.rb * * 1 021

Rails.application.configure do
  ...
    OmniAuth.config.test_mode = true
    OmniAuth.config.mock_auth[:linkedin] = { 
      'provider' => 'linkedin', 
      'uid' => '123545', 
      'info'=>
      { 'email'=>'infinite@jest.com',
        'first_name'=>'Dave',
        'last_name'=>'Wallace' }
    }
end

спецификации / особенности / sign_in_feature_spec.rb

require 'rails_helper'

feature 'Sign in with LinkedIn' do

  before do 
    OmniAuth.config.add_mock(:linkedin, {:uid => '12345'})
  end

  let(:user) { create(:user) } 

  scenario 'with valid email and password' do
    visit '/'
    expect(page).to have_no_content 'Sign Out'
    click_link 'nav-sign-in' # image/button: Sign in with LinkedIn
    expect(page).to have_content 'Sign Out'
  end
end    

Дайте мне знать, если / как я могу улучшить это решение (и мой код!)

1 голос
/ 28 марта 2014

Выбранное решение не работает для меня.Мое решение я получаю от https://gist.github.com/kinopyo/1338738 и официального документа https://github.com/intridea/omniauth/wiki/Integration-Testing здесь:

# in spec/support/omniauth_macros.rb
module OmniauthMacros
  def mock_auth_hash
    # The mock_auth configuration allows you to set per-provider (or default)
    # authentication hashes to return during integration testing.
    OmniAuth.config.mock_auth[:odnoklassniki] = OmniAuth::AuthHash.new({
         :provider => 'odnoklassniki',
         :uid => '123545',
         :info => OmniAuth::AuthHash::InfoHash.new({
             :name => 'mockuser'
         })
     })

  end
end

# in spec/spec_helper.rb
RSpec.configure do |config|

  # email spec
  config.include(EmailSpec::Helpers)
  config.include(EmailSpec::Matchers)
end
OmniAuth.config.test_mode = true

# in spec example:
visit new_user_registration_path
mock_auth_hash
find('#btn-odnoklassniki').click # here is link generated as omniauth_authorize_path(resource_name, provider)
...