Ruby on rails 使用designe测试成功登录
我正在尝试学习Michael Hartl的RoR教程,但这是我第三次学习,现在我正在尝试实现Desive,而不是教程中的自制认证。正如您可以想象的,这有点痛苦,主要是因为RoR教程中的测试驱动开发没有与Desive很好地结合。我目前的问题是,我似乎无法成功测试成功的登录。我在localhost上安装了网站,所以我知道登录可以正常工作,但由于某些原因,我的测试仍然失败。下面是集成测试片段Ruby on rails 使用designe测试成功登录,ruby-on-rails,devise,Ruby On Rails,Devise,我正在尝试学习Michael Hartl的RoR教程,但这是我第三次学习,现在我正在尝试实现Desive,而不是教程中的自制认证。正如您可以想象的,这有点痛苦,主要是因为RoR教程中的测试驱动开发没有与Desive很好地结合。我目前的问题是,我似乎无法成功测试成功的登录。我在localhost上安装了网站,所以我知道登录可以正常工作,但由于某些原因,我的测试仍然失败。下面是集成测试片段 def setup @user = users(:michael) end ... test "log
def setup
@user = users(:michael)
end
...
test "login with valid information" do
get user_session_path
assert_equal 200, status
post user_session_path, 'user[email]' => @user.email, 'user[password]' => "password"
follow_redirect!
assert_equal 200, status
assert_select "a[href=?]", user_session_path, count: 0 # THIS LINE FAILS
assert_select "a[href=?]", destroy_user_session_path
assert_select "a[href=?]", user_path(@user)
end
我得到的错误是
FAIL["test_login_with_valid_information", UsersLoginTest, 2016-06-19 11:06:18 -0400]
test_login_with_valid_information#UsersLoginTest (1466348778.61s)
Expected exactly 0 elements matching "a[href="/users/sign_in"]", found 1..
Expected: 0
Actual: 1
顶部的登录栏从登录
切换到帐户
,因此测试似乎没有让设置块中的用户成功登录。另一个可能不相关的问题是,在我的另一个测试中,我使用post user\u session\u path…
尝试了相同的登录方法,然后用assert\u not current\u user.nil?
检查current\u user
检查是否为空
NameError: undefined local variable or method 'current_user' for #<UsersLoginTest:0x00557f81155648>
与前面的测试登录名的方法不同,我得到了以下错误
ERROR["test_login_with_valid_information", UsersLoginTest, 2016-06-28 20:40:59 -0400]
test_login_with_valid_information#UsersLoginTest (1467160859.16s)
RuntimeError: RuntimeError: not a redirect! 200 OK
test/integration/users_login_test.rb:36:in `block in <class:UsersLoginTest>'
test/integration/users_login_test.rb:36:in `block in <class:UsersLoginTest>'
ERROR["test_login_with_valid_information_followed_by_logout", UsersLoginTest, 2016-06-28 20:40:59 -0400]
test_login_with_valid_information_followed_by_logout#UsersLoginTest (1467160859.18s)
NameError: NameError: undefined local variable or method `current_user' for #<UsersLoginTest:0x0055d0b9e0df50>
test/integration/users_login_test.rb:49:in `block in <class:UsersLoginTest>'
test/integration/users_login_test.rb:49:in `block in <class:UsersLoginTest>'
看来这是未经授权的?此外,我还试图将include designe::Test::IntegrationHelpers
放在我的用户登录测试的顶部,但它只是抛出了一个错误NameError:uninitialized constant designe::Test
您是否尝试过使用post\u via\u重定向
post_via_redirect user_session_path, 'user[email]' => @user.email, 'user[password]' => @user.password
编辑:
您是否已将Desive测试助手包括到您的测试助手中
class ActionController::TestCase
include Devise::TestHelpers
end
我有一个类似的问题,可能会帮助你找到答案。我认为我的装置不正确,因此Desive未进行验证
我的用户装置,以防它帮助您:
user_no_club:
email: noclub@example.com
encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
confirmed_at: 2016-01-02 08:31:23
confirmation_sent_at: 2016-01-02 08:30:59
编辑:
在进一步的调查中,我认为design集成测试应该使用。我还没能让它工作,但我的理解是,文档和gem可能暂时不同步
编辑以下有关单元和控制器中测试的更多注释:
我在单元测试和控制器中使用了sign_in@user,效果很好。控制器测试(如以下)运行良好:
@user = users(:one)
@other_user = users(:two)
sign_in @user
get :edit, id: @other_user
assert_redirected_to root_url
我有,但它似乎也不起作用。今天晚些时候我将重试,并使用您的代码片段更新特定结果。您是否在ActionController::TestCase中包含Desive::TestHelpers?以防万一,您是否阅读了下面引用的内容?其中一件事是,每当你想对Desive控制器进行单元测试时,你需要告诉Desive要使用哪个映射。我们需要它,因为ActionController::TestCase和spec/Controller绕过了路由器“”,所以您对route.rb的引用似乎不适用于testsAs forcurrent_user
helper,它是由Desive gem添加到ApplicationController中的。默认情况下,它将不可用于您的测试。有关控制器测试,请参见-,请包含designe::Test::ControllerHelpers`代替。
最后,您应该深入调查问题的原因。在输出中保留sign_in链接在这里没有帮助。你应该找到一种方法来调试你的帖子上发生的事情和失败的事情,例如一些设计错误。嗨,我也有同样的问题。你找到解决办法了吗?@imarg,我还没来得及测试Jemima在答案中包含的所有内容,但我会从那里开始。虽然这并没有真正解决我的问题,但我认为它提供了最好的答案。在单元测试中,您是否获得了使用Desive gem资源的功能?我想我可以通过检查sign\u in@user
是否起作用来做一个功能类似的测试,但是像sign\u in
和current\u user
这样的资源目前在我的单元测试中不可用。在我的例子中,我在夹具的行中缺少confirm\u。谢谢你发布代码。
user_no_club:
email: noclub@example.com
encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
confirmed_at: 2016-01-02 08:31:23
confirmation_sent_at: 2016-01-02 08:30:59
Completed 401 Unauthorized in 1ms (ActiveRecord: 0.0ms)
@user = users(:one)
@other_user = users(:two)
sign_in @user
get :edit, id: @other_user
assert_redirected_to root_url