2016-03-27 4 views
0

Я пытаюсь проверить вход и выход в этом приложении RoR. Мое испытание таково:Майкл Хартл Ruby on Rails Tutorial ch 8.3 | Не знаю, почему этот тест терпит неудачу.

test "login with valid information followed by logout" do 
    get login_path 
    post login_path, session: { email: @user.email, password: 'password' } 
    assert is_logged_in? 
    assert_redirected_to @user 
    follow_redirect! 
    assert_template 'users/show' 
    assert_select "a[href=?]", login_path, count: 0 
    assert_select "a[href=?]", logout_path 
    assert_select "a[href=?]", user_path(@user) 
    delete logout_path 
    assert_redirected_to root_url 
    assert_not is_logged_in? # <-- this line is the one that cocks up. 
    follow_redirect! 
    assert_select "a[href=?]", login_path 
    assert_select "a[href=?]", logout_path,  count: 0 
    assert_select "a[href=?]", user_path(@user), count: 0 
end 

Маркированная линия - единственная линия, которая терпит неудачу, и я не знаю, почему. Это точно так же, как и в самой книге.

Отправка запроса удаления для выхода из системы путей путей к этой функции:

def destroy 
    logout 
    redirect_to root_url 
end 

Функция выхода из системы заключается в следующем:

def logout 
    session.delete(:user_id) 
    @current_user = nil 
end 

И is_logged_in? функция такова:

def is_logged_in? 
    !current_user.nil? 
end 

Все 3 из них в точности соответствуют тому, как написано в книге, вплоть до названий. (У меня были свои лучшие имена, но я их отменил отчаяния.)

Сайт, похоже, работает нормально. Here's ссылку, чтобы вы могли видеть сами. Я могу войти и выйти просто отлично.

Я использовал assert_not в другом месте, и все работает отлично. Например:

test "login with invalid information" do 
    get login_path 
    assert_template 'sessions/new' 
    post login_path, session: { email: "", password: "" } 
    assert_template 'sessions/new' 
    assert_not flash.empty? 
    get root_path 
    assert flash.empty? 
end 

Этот тест преуспевает. («Вспышка» относится к маленькому ящику в верхней части страницы, в котором говорится, что в этом случае их входная информация недействительна.)

У кого-нибудь есть идеи? Большое спасибо.

ответ

0

До сих пор в учебнике вы должны были использовать сеансы, и я вижу, что вы удаляете сеанс в своем методе logout.

Кроме того, «вспомогательные методы не доступны в тестах, мы не можем использовать current_user как в листинге 8.15, но метод session доступен»

Ваш метод is_logged_in? должен выглядеть следующим образом, то:

def is logged_in? 
    !session[:user_id].nil? 
end 
+0

Хорошо, я пробовал это по-своему, и теперь он отлично работает. Большое спасибо! –

+0

@LlamaTarianism yup no problem :) –