2016-08-24 3 views
8

Я пытаюсь проверить, что кто-то может войти на мой сайт, выполнив запрос POST на мой SessionsController. Я видел этот способ, рекомендованный в нескольких местах:Rails test - проверка, если пользователь вошел в систему с Devise

it 'must be able to sign in a user' do 
    user = create(:user) 
    post :create, format: :js, user: {email: user.email, password: user.password, remember_me: 0} 
    assert_response :success 
    @controller.current_user.must_equal user 
end 

Но этот тест неверен. Вызов @controller.current_user попытается выполнить аутентификацию пользователя с использованием опубликованных параметров и вернет user, если указанный адрес электронной почты/пароль верен. Нет никакой гарантии, что действие create действительно вызывает sign_in или current_user.

Даже если я переписал тест, чтобы проверить, что эти методы вызывают, возможно, что другие методы могут быть вызваны, например. sign_out.

Есть ли более определенный способ в конечном счете проверить, зарегистрирован ли пользователь, и если да, то кто пользователь?

EDIT -

Например, следующий тест будет проходить

it 'must sign in a user' do 
    @controller.current_user.must_equal nil 
    post :create, format: :js, user: {email: @user.email, password: @user.password, remember_me: 0} 
    assert_response :success 
    @controller.current_user.must_equal @user 
end 

когда SessionsController # создать действие:

def create 
    respond_to do |format| 
     format.js { 
     render nothing: true, status: 200 
     } 
    end 
end 
+0

Может ли это помочь? http://stackoverflow.com/questions/23793597/how-to-access-devise-current-user-in-a-rspec-feature-test – tmn4jq

+0

Боюсь, я не думаю, что это помогает. У меня нет проблем с вызовом current_user. – user1063998

+0

является '.current_user' методом, который пытается войти в систему пользователя или является attr_reader для переменной экземпляра? Если первое, то кажется, что вы описываете, это ожидаемое поведение. –

ответ

2

решение с минимальными изменениями в предлагаемом код в вопрос:

Перед началом тестирования необходимо инициализировать систему. Попробуйте предваряя следующий код перед кодом я t 'must be able to sign in a user' do:

before (:each) do 
    user = FactoryGirl.create(:user) 
    sign_out user 
end 

Это должно превратить ваш тест в допустимый тест для вашего почтового контроллера.

Объяснение:

Мое предположение, что ваш тест выше всегда удается, потому что пользователь уже подписан в (другими тестами запустить перед этим). Вы можете проверить это, используя byebug в строке после it и запустите current_user в консоли bybug's. Если это не nil, пользователь уже выполнил вход, что недействительно.

Обратите внимание, что (отличное от того, что обсуждается выше в комментариях), current_user не изменяет статус пользователя; это функция только для чтения.

Shorter/очиститель раствор:

На мой взгляд, есть аа уборщик способ выполнить такое испытание, как следующим образом:

def sign_in_via_post(user) 
    post :create, format: :js, user: {email: user.email, password: user.password, remember_me: 0} 
end 

... 

before (:each) do 
    user = FactoryGirl.create(:user) 
    sign_out user 
end 

it 'must be able to sign in a user' do 
    { sign_in_via_post user }.should change { current_user }.from(nil).to(user) 
end 

С should change from nil to user заявление, вы подтверждаете, что пользователь был выведен из системы до начала теста и что пользователь вошел в систему после выполнения теста.

Обратите внимание, что часть

{ sign_in_via_post user }.should change { current_user }.from(nil).to(user) 

эквивалентно (возможно, легче понять) код

{ sign_in_via_post user }.should change { user_signed_in? }.from(false).to(true) 

, как обсуждалось here.

+0

Спасибо за ответ. Я верю, что 'current_user' может обновить состояние пользователя. Я добавил образец теста в свой первоначальный вопрос, который, я считаю, иллюстрирует проблему. – user1063998

+0

У меня просто была мысль, возможно, есть файл before_action/filter, который что-то делает, но я не могу проверить прямо сейчас. Возможно, вы правы – user1063998

+0

@ user1063998: у вас была возможность проверить мое предложение? Я потратил немало времени на то, чтобы придумать решение (по крайней мере, я думаю, это решение). В любом случае, это было хорошее упражнение, но я предпочел бы, чтобы он проверил его лицо. – Olli

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