Ruby on Rails functional test with Devise authentication

前端 未结 3 1778
深忆病人
深忆病人 2021-02-06 02:57

I\'m searching for a solution for a weird problem. I have a controller, that needs authentication (with the devise gem). I added the Devise TestHelpers but i can\'t get it worki

相关标签:
3条回答
  • 2021-02-06 03:05

    Are you using Devise with confirmable? In this case, create is not enough and you need to confirm the user with @user.confirm!

    Second, why do you create the user in the functional test? Declare your users in the fixture like this (confirmed_at if you require confirmation only):

    test/fixtures/users.yml:

    user1: 
    id: 1
    email: user1@test.eu
    encrypted_password: abcdef1
    password_salt:  efvfvffdv
    confirmed_at: <%= Time.now %>
    

    and sign them in in your functional tests with:

    sign_in users(:user1)
    

    Edit: I just saw, that in my app the Devise-Testhelpers are declared in test/test-helpers.rb and I don't know if this makes a difference, maybe you want to try:

    ENV["RAILS_ENV"] = "test"
    require File.expand_path('../../config/environment', __FILE__)
    require 'rails/test_help'
    
    class ActionController::TestCase
      include Devise::TestHelpers
    end
    
    class ActiveSupport::TestCase
      # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
      #
      # Note: You'll currently still have to declare fixtures explicitly in integration tests
      # -- they do not yet inherit this setting
      fixtures :all
    
      # Add more helper methods to be used by all tests here...
    end
    
    0 讨论(0)
  • 2021-02-06 03:07

    I had a similar issue (but using FactoryGirl, rather than Fixtures) and was able to resolve it by simply using FactoryGirl.create(:user) rather than FactoryGirl.build(:user).

    Evidently, Devise requires the user to have been persisted to the Database, for everything to work properly.

    0 讨论(0)
  • 2021-02-06 03:22

    This took me some time to figure out but it turns out the answer is really simple.

    The point is that, in your fixtures file (users.yml), you need to make sure the user is 'confirmed' (assuming that you specified "confirmable" in your User model). So, for instance, put this in your users.yml:

    user_one:
      confirmed_at: 2015/01/01
    

    That's all, no need to specify other fields (email, encrypted password, etc).

    Now in your controller test (e.g. in 'setup' or in 'before') you simply code:

    sign_in users(:user_one)
    

    And then it should just work!

    0 讨论(0)
提交回复
热议问题