8

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

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

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 

Authentication это имя моей модели и вызова .uid в консоли rails возвращает строку в порядке.

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

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

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

ответ

14

Я бегу в нечто подобное.

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

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] 

где-то в TestCase?

+1

Здравствуйте! Я попробовал request.env ["omniauth.auth"], но я получаю ошибку "undefined method env для nil class" – izumeroot

+0

BTW, вот верное решение https://gist.github.com/kinopyo/1338738 – izumeroot

6

Вы пытались переместить эти две строки в 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

Выбранное решение для меня не работает. Мое решение я получаю от 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) 
+0

спасибо, что указали к AuthHash.new (хотя он находится на веб-странице тестирования интеграции) мне удалось заставить это работать с коалой, если у меня есть FactoryGirl моей модели авторизации, которая включала реальный секрет и токен (например, копирование и вставка из действительного входа в facebook переход) – Ben

1

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

Короче ...

  • Установите макет
  • Сделать запрос
  • теста любой код прилагается к функции обратного вызова

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

Мой код ...

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

Rails.application.configure do 
    ... 
    OmniAuth.config.test_mode = true 
    OmniAuth.config.mock_auth[:linkedin] = { 
     'provider' => 'linkedin', 
     'uid' => '123545', 
     'info'=> 
     { 'email'=>'[email protected]', 
     '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  

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

+0

Отлично! Я подтверждаю, что решение разрешает проблему – jedi

Смежные вопросы