Тестовый курс по Ruby on Rails не пройден - PullRequest
0 голосов
/ 07 февраля 2011

Я работаю с книгой railstutorial.org, глава 9. При запуске набора тестов я не могу избавиться от следующей ошибки.Весь код пытался сначала ввести его, а затем скопировать и вставить из книги.

...............F............................................

Failures:

  1) SessionsController DELETE 'destroy' should sign a user out
     Failure/Error: controller.should_not be_signed_in
       expected signed_in? to return false, got true
     # ./spec/controllers/sessions_controller_spec.rb:69:in `block (3 levels) in <top (required)>'

Finished in 8.28 seconds
60 examples, 1 failure

Вот код для теста в session_controller_spec.rb:

describe "DELETE 'destroy'" do

  it "should sign a user out" do
    test_sign_in(Factory(:user))
    delete :destroy
    controller.should_not be_signed_in
    response.should redirect_to(root_path)
  end
end

(Я думаю) соответствующие части session_controller.rb:

def destroy
  sign_out
  redirect_to root_path
end

Метод sign_out находится в session_helper.rb

def current_user=(user)
  @current_user ||= user_from_remember_token
end

def current_user
  @current_user
end

def signed_in?
  !current_user.nil?
end

def sign_out
  cookies.delete(:remember_token)
  self.current_user = nil
end

Итак, если я правильно понимаю, тестпосле входа в систему пользователь фабрики вызывает метод destroy SessionsController, который вызывает sign_out (из SessionsHelper), который явно устанавливает self.current_user в значение nil.Тогда тест проверяет подпись?со строкой be_signed_in.Так как код устанавливает self.current_user в nil, current_user.nil?должен вернуть true,! current_user.nil?должен вернуть false, чего и хочет тест (controller.should_not be_signed_in).

Любая помощь будет принята с благодарностью.Я изучаю Ruby, Rails и TDD одновременно, поэтому я не уверен, в чем заключается моя проблема.

1 Ответ

2 голосов
/ 07 февраля 2011

Проблема в том, как вы настраиваете текущего пользователя - вы только когда-либо настраиваете его для входа в систему с токена запоминания, вы никогда не позволяете ему установить значение ноль.Вы можете попробовать следующее:

def current_user=(user)
  @current_user = user
end

def current_user
  @current_user ||= user_from_remember_token
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...