如何使用Devise in Rails4测试登录/注销用户

时间:2015-06-05 16:51:00

标签: ruby-on-rails ruby ruby-on-rails-4 testing devise

我试图确保使用Devise in Rails 4来维护正确的用户访问权限,并且我很难在测试套件中记录用户。

最简单的情况:

require 'test_helper'
  include Devise::TestHelpers

class SiteLayoutTest < ActionDispatch::IntegrationTest

  def setup
    @user = users(:test1)
  end

  test "logged in should get index" do
    sign_in @user
    get users_path
    assert_response :success
    assert_select "title", "User Index"
  end
end

到目前为止,除了使用适当的操作实现Devise和Users控制器之外,我还没有做得更多。

我一直得到:NoMethodError: undefined method 'env' for nil:NilClass,特指含有sign_in @user的行,我可以找到其他人遇到相同错误的实例,但似乎从来没有找到问题的实际解决方案我&# 39; m试图解决。

如何使用Devise in Rails 4登录用户进行测试?感谢。

编辑:

夹具/ users.yml里

test1:
  id: '1'
  email: 'test1@example.com'
  encrypted_password: <%= Devise::Encryptor.digest(User, "password") %>
  created_at: <%= Time.now - 6.minutes %>
  updated_at: <%= Time.now - 4.minutes %>

原位解决方案:

test "logged in should get index" do
  post user_session_path, 'user[email]' => @user.email, 'user[password]' =>  'password'
  get users_path
  assert_response :success
  assert_select "title", "User Index"
end

1 个答案:

答案 0 :(得分:7)

这是来自docs

  

&#34;不要在集成测试中使用Devise :: TestHelpers。&#34;

您必须手动登录。这是一个网站测试示例,除非已登录,否则不允许用户访问根路径。您可以在支持文件中创建一种方法,手动登录用户,然后在您想要登录时调用它用户,因此您每次需要登录用户时都不必使用此代码。

        HtmlAgilityPack.HtmlWeb hw = new HtmlAgilityPack.HtmlWeb();
        HtmlAgilityPack.HtmlDocument doc = hw.Load("https://www.test.com");

        var hrefs = (from image in doc.DocumentNode.Descendants()
                        where image.Name == "img" &&
                            image.ParentNode.Name == "a"
                        select image.ParentNode).ToList();

        foreach (var href in hrefs)
        {
            newHtmls.Add(href.GetAttributeValue("href", ""));
        }

编辑:以防万一它将来会有所帮助。您可以使用Warden Test Helpers进行集成测试,但上述方法是更好的测试。这是一个有效的例子:

require 'test_helper'

 class UserFlowsTest < ActionDispatch::IntegrationTest
   test "signed in user is redirected to root_path" do
     get user_session_path
     assert_equal 200, status
     @david = User.create(email: "david@mail.com", password: Devise::Encryptor.digest(User, "helloworld"))
     post user_session_path, 'user[email]' => @david.email, 'user[password]' =>  @david.password
     follow_redirect!
     assert_equal 200, status
     assert_equal "/", path
   end

   test "user is redirected to sign in page when visiting home page" do
     get "/"
     assert_equal 302, status
     follow_redirect!
     assert_equal "/users/sign_in", path
     assert_equal 200, status
   end
 end