Учебник Майкла Хартла по Rails: «Ожидаемый ответ Rspec для перенаправления на ...» неверен - PullRequest
4 голосов
/ 26 января 2011

В замечательном учебнике Майкла Хартла по Rails я получаю неожиданный сбой теста Rspec в форме:

"Ожидаемый ответ будет перенаправлением на <<a href="http://test.host/signin" rel="nofollow">http://test.host/signin>, но былперенаправление на <<a href="http://test.host/signin?notice=Please+sign+in+to+access+this+page." rel="nofollow">http://test.host/signin?notice=Please+sign+in+to+access+this+page.>."

(найдите это в Разделе 10.3.) Таким образом, из самой ошибки вы можете видеть, что сервер перенаправляет на соответствующую страницу, за исключением того, что есть дополнительное уведомлениена "Пожалуйста, войдите". Код теста выглядит следующим образом:

describe "GET 'index'" do

describe "for non-signed-in users" do
  it "should deny access" do
    get :index
    response.should redirect_to(signin_path)
    flash[:notice].should =~ /sign in/i
  end
end

...

Я что-то здесь не так делаю? Как лучше это исправить?


Обновление:

Если я изменю код на

response.should redirect_to('http://test.host/signin?notice=Please+sign+in+to+access+this+page.')

, тогда я получаю и фактическую ошибку Ruby

Ошибка / Ошибка: flash [:Уведомление] .should = ~ / войти / я ожидал: / войти / i, получил: ноль (используя = ~)


Разрешение

Проблема в том, что в моей функции deny_access пропущена запятая:

redirect_to signin_path :notice => "Please sign in to access this page."

должно было быть

redirect_to signin_path, :notice => "Please sign in to access this page."

Это исправило это. Теперь побочный эффект этого исправления былинтересно не так ли?Означает ли это, что signin_path сама по себе является функцией, которая может принимать хеш или аргументы, добавляемые в конец пути?Странно, дико и замечательно.

1 Ответ

2 голосов
/ 26 января 2011

Как выглядят ваши методы аутентификации? Я не видел, чтобы уведомление о флэш-памяти добавлялось в строку запроса, как это раньше: / Это заставляет меня думать, что ваши методы могут быть неправильными. Это должно быть что-то вроде:

def deny_access
  redirect_to signin_path, :notice => "Please sign in to access this page."
end

OR

def deny_access
  flash[:notice] = "Please sign in to access this page."
  redirect_to signin_path
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...