【问题标题】:Ruby on Rails Tutorial Test Not PassingRuby on Rails 教程测试未通过
【发布时间】:2013-08-13 22:33:42
【问题描述】:

我正在阅读 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

这是 sessions_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

所以,如果我理解正确的话,在工厂用户登录后,测试会调用 SessionsController 的 destroy 方法,该方法调用 sign_out(来自 SessionsHelper),该方法将 self.current_user 显式设置为 nil。然后测试检查 signed_in?使用 be_signed_in 行。由于代码将 self.current_user 设置为 nil,current_user.nil?应该返回 true,!current_user.nil?应该返回 false,这是测试想要的 (controller.should_not be_signed_in)。

任何帮助将不胜感激。我正在同时学习 Ruby、Rails 和 TDD,所以我不确定我的问题出在哪里。

【问题讨论】:

  • 能否添加代码来说明如何实现 current_user= 函数?
  • current_user=(user) 返回@current_user ||= user_from_remember_token,在查看时我确实发现了另一个错误,因为 current_user 的定义方式相同,检查这本书时,应该只返回 @current_user .但是,我改变了它,我仍然从测试中得到同样的错误。
  • 抱歉,已登录?在 session_helper.rb 中找到。我将编辑问题以反映这一点,并包含 current_user= 和 current_user 的代码。

标签: ruby-on-rails


【解决方案1】:

问题在于您如何设置当前用户 - 您只是将其设置为从记忆令牌登录,您从未允许将其设置为 nil。您可能想尝试以下方法:

def current_user=(用户) @current_user = 用户 结尾 定义当前用户 @current_user ||= user_from_remember_token 结尾

【讨论】:

  • 非常感谢您的帮助。
猜你喜欢
  • 2016-08-06
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多