Michael Hartl的Ruby on Rails教程ch 8.3 |不确定为什么这个测试失败了

时间:2016-03-27 22:58:07

标签: ruby-on-rails ruby railstutorial.org

我试图在此RoR应用中测试登录和退出。我的测试是这样的:

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

所有这三个都完全按照书中所说的那样,直到名字。 (我确实有自己更好的名字,但是我把它们从绝望中改变了。)

该网站似乎运作正常。 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

此测试成功。 (&#39; Flash&#39;指的是页面顶部的一个小方框,告诉用户,在这种情况下,他们的登录信息无效。)

有人有任何想法吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

到目前为止,在本教程中,您应该使用过会话,我可以看到您使用logout方法删除会话。

此外,&#34;辅助方法在测试中不可用,我们无法使用代码清单8.15中的current_user,但session方法可用&#34 ;

您的is_logged_in?方法应如下所示:

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