Rspec проблема макет модели в контроллере - PullRequest
1 голос
/ 18 марта 2011

Я установил контроллер, который обрабатывает всевозможные аутентификации, которые обрабатываются в специальной системе аутентификации. я пытаюсь проверить логику на предмет того, как обрабатываются аутентификации (например: если пользователь уже имеет / не имеет учетной записи, если пользователь в настоящее время / не вошел в систему и т. д.). у меня есть модель авторизации и контроллер авторизации. Действие по созданию авторизации имеет следующую общую схему:

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 все еще оценивается и не заглушается при выполнении теста

1 Ответ

0 голосов
/ 18 марта 2011

Ты уточняешь

current_user?(@authmock.user).should == true

или

response.should redirect_to(root_path)

Я думаю, что первое ожидание не должно проверяться здесь, потому что вы издевались над блоком «если авторизация», так что вы должны указать, что будет потом!

...