Я установил контроллер, который обрабатывает всевозможные аутентификации, которые обрабатываются в специальной системе аутентификации. я пытаюсь проверить логику на предмет того, как обрабатываются аутентификации (например: если пользователь уже имеет / не имеет учетной записи, если пользователь в настоящее время / не вошел в систему и т. д.). у меня есть модель авторизации и контроллер авторизации. Действие по созданию авторизации имеет следующую общую схему:
class AuthorizationsController < ApplicationController
def create
omniauth = request.env['omniauth.auth']
authorization = Authorization.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
if authorization
# Authorization already established, log in user
elsif current_user
# User is logged in but wants to add another omniauth authentication
else
# Create user and associate them with omniauth authentication
end
end
end
Я пытаюсь проверить эту логику в Rspec, но у меня возникли проблемы. Вот то, с чем я работаю в моей спецификации:
describe AuthorizationsController do
render_views
describe "POST 'create'" do
describe "with an already existing authorization" do
it "should log the user in" do
@authmock = mock_model(Authorization)
Authorization.should_receive(:find_by_provider_and_uid).and_return(@authmock)
post :create, :provider => 'twitter'
current_user?(@authmock.user).should == true
response.should redirect_to(root_path)
end
end
end
end
У меня сложилось впечатление, что это должно присвоить мою ложную модель авторизации (@authmock) авторизации локальной переменной в моем контроллере при вызове присваивания, таким образом, делая 'if authorization' возвращать true Однако всякий раз, когда я верный, чтобы запустить эту спецификацию, я получаю эту ошибку:
Failures:
1) AuthorizationsController POST 'create' with an already existing authorization should log the user in
Failure/Error: post :create, :provider => 'twitter'
NoMethodError:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]
# ./app/controllers/authorizations_controller.rb:5:in `create'
# ./spec/controllers/authorizations_controller_spec.rb:16:in `block (4 levels) in <top (required)>'
Может ли кто-нибудь просветить меня, что я здесь делаю неправильно?
Изменить:
поскольку был поднят вопрос о том, вызывает ли проблема назначение omniauth, я закомментировал эту строку, чтобы увидеть, что произойдет, и получил следующую ошибку:
1) AuthorizationsController POST 'create' with an already existing authorization should log the user in
Failure/Error: post :create, :provider => 'twitter'
NameError:
undefined local variable or method `omniauth' for #<AuthorizationsController:0xb41809c>
# ./app/controllers/authorizations_controller.rb:5:in `create'
# ./spec/controllers/authorizations_controller_spec.rb:16:in `block (4 levels) in <top (required)>'
, который говорит мне, что проблема в макете или заглушке, так как функция find_by_provider_and_uid все еще оценивается и не заглушается при выполнении теста