Ruby on rails 使用designe测试成功登录

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

我正在尝试学习Michael Hartl的RoR教程,但这是我第三次学习,现在我正在尝试实现Desive,而不是教程中的自制认证。正如您可以想象的,这有点痛苦,主要是因为RoR教程中的测试驱动开发没有与Desive很好地结合。我目前的问题是,我似乎无法成功测试成功的登录。我在localhost上安装了网站,所以我知道登录可以正常工作,但由于某些原因,我的测试仍然失败。下面是集成测试片段

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 for
current_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