Rails rspec и omniauth (интеграционное тестирование)
мое приложение Rails 3.2 использует OmniAuth и Devise для входа в Twitter. Система аутентификации работает нормально. Я хотел бы написать интеграционный тест в rspec, чтобы убедиться, что все работает. Используя информацию в Вики, я написал следующее, Но я знаю, что мне чего-то не хватает.
под испытанием.rb в config / environments у меня есть следующие строки
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 возвращает строку fine.
Я получаю следующую ошибку при запуске этого теста:
Failure/Error: Authentication.last.uid.should == '123545'
NoMethodError:
undefined method `uid' for nil:NilClass
может ли кто-нибудь помочь мне выяснить, как использовать OmniAuth издевается, которые предоставляются? Объяснение почему и как это работает будет оценено также.
4 ответов
я сталкиваюсь с чем-то подобным.
после изменения моего макета объекта с помощью символьных клавиш:
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]
где-то в вашем примере?
вы пытались переместить эти две строки в spec_helper.РБ?
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
выбранное решение не работает для меня. Мое решение я получаю от https://gist.github.com/kinopyo/1338738 и официальный doc 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)
я настоятельно рекомендую ответ
короче...
- подстроили
- сделать заказ
- Проверьте любой код, прикрепленный к обратному вызову
например: проверить сеанс ['uid'] был установлен (хотя, я предпочитаю проверять только то, что видит пользователь, или, скорее, не видит)
мой код...
config / environments / test.rb
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
spec / features / 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
Дайте мне знать, если/как я могу улучшить это решение (и мой код!)