Ruby on rails Hartl'的注销错误;s RubyonRails教程8.3
我在MichaelHartl的RubyonRails教程8.3中的用户登录测试中遇到了断言选择问题 这就是测试:Ruby on rails Hartl'的注销错误;s RubyonRails教程8.3,ruby-on-rails,Ruby On Rails,我在MichaelHartl的RubyonRails教程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_redirecte
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_not is_logged_in?
assert_redirected_to root_url
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
当我运行测试时,我得到1个失败:
FAIL["test_login_with_valid_information_followed_by_logout",
UsersLoginTest, 2016-01-20 09:51:41 +0000]
test_login_with_valid_information_followed_by_logout#UsersLoginTest (1453283501.83s)
Expected at least 1 element matching "a[href="/login"]", found 0..
Expected 0 to be >= 1.
test/integration/users_login_test.rb:31:in `block in <class:UsersLoginTest>'
会话\u控制器:销毁
def destroy
log_out
redirect_to root_url
end
首先尝试查看您的路由中是否有登录路径
rake routes | grep 'login'
你应该有这些:
login GET /login(.:format) sessions#new
POST /login(.:format) sessions#create
然后,由于您的错误:
Expected at least 1 element matching "a[href="/login"]", found 0..
这意味着它找不到一个
您正在参考Hartl教程的第8.3节,但看起来您已经开始学习下一节了。这就是实现持久会话的地方
我知道,因为你的代码中有一些“记住”的东西。例如:
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
您的测试失败了,因为您可能有一个活动的记忆令牌cookie,但是您的注销方法不会“忘记”它。基本上,您只完成了Hartl部分的一半;所以测试自然会失败(证明测试有效!)
如果您继续学习本教程,它将引导您完成注销时忘记此cookie的过程。或者,您可以回溯并删除在8.3之后放置的位。无论哪种方式,该测试都应该通过。你能从会话控制器发布代码吗?是的,我不想过载,不知道需要什么,但我现在就发布。OP已经确认没有在浏览器中看到登录链接:“我仍然登录(在角落里,我仍然有指向我的个人资料、设置和注销的链接)。”好的@dwenzel你可以发布你的视图(你输出你的登录注销信息的部分---导航栏)吗?你可以把你的助手的内容放到destroy函数中吗Session.delete(:user\u id)@current\u user=nil
和comment#log\u你也可以为销毁控制器发布你的参数的内容吗?我可能和其他懒惰的程序员一样,跳过了最后一行布局/\u header.html.erb:
我没有注意最后一段代码。需要更改为
。这个答案有帮助。事实上,正如其他人所说,证明测试是有效的。是的,我想就是这样,在添加了returnfalse if‘memory_digest.nil’之后,一切都开始起作用了。谢谢
login GET /login(.:format) sessions#new
POST /login(.:format) sessions#create
Expected at least 1 element matching "a[href="/login"]", found 0..
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end