2016-07-19 23 views
0

私のユーザ認証にはdevise_auth_token gemが使用されており、 "stackoverflow"サイト(このサイト)をシミュレートするrails-apiを作成しています。 (質問、回答、または投票を作成する)ためには、最初にログインする必要があります。機能テストでは、devise_token_authでログインする必要があります

私の 'Questions_controller_test'で 'sign_in'メソッドを使用すると、 '@ controller.api_user_signed_in'という指定されたユーザーのIDが返されます。常にfalseを返します。つまり、ユーザーがすでにサインインしていないため、テストは失敗します。

誰もこの問題を処理するための提案をくれますか、ありがとう。ここ は私controllers_test

require 'test_helper' 
require 'devise_token_auth' 

class QuestionsControllerTest < ActionController::TestCase 

    def setup 
    @controller = Api::QuestionsController.new 

    @current_user = users(:confirmed_email_user) 
    @current_user.save! 

    @auth_headers = @current_user.create_new_auth_token 

    @result = sign_in @current_user 

    Ability.new(@current_user) 

    @token  = @auth_headers['access-token'] 
    @client_id = @auth_headers['client'] 
    @expiry = @auth_headers['expiry'] 

    age_token(@current_user, @client_id) 

    end 
#======================================================== 
    test 'Get #index' do 
    # this test passes 
    get :index 
    assert_response :ok 
    end 

    test 'Post #create' do 
    # this test fails cause the controller.current_api_user == nil 
     post :create , params: {title: 'Q1', description: 'sjdfsdfs'}, headers: @auth_headers, auth_token: @current_user.auth_token 
    assert_response :created 
    end 
end 

の一つであり、test_helperは私がuser_sign_inをスタブすることにより、この問題を解決し

ENV['RAILS_ENV'] ||= 'test' 
require File.expand_path('../../config/environment', __FILE__) 
require 'rails/test_help' 
require 'capybara/rails' 
require 'devise' 

class ActiveSupport::TestCase 
    # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 
    fixtures :all 

    def age_token(user, client_id) 
    if user.tokens[client_id] 
     user.tokens[client_id]['updated_at'] = Time.now - (DeviseTokenAuth.batch_request_buffer_throttle + 50.seconds) 
     user.save! 
    end 
    end 

    def expire_token(user, client_id) 
    if user.tokens[client_id] 
     user.tokens[client_id]['expiry'] = (Time.now - (DeviseTokenAuth.token_lifespan.to_f + 10.seconds)).to_i 
     user.save! 
    end 
    end 

    # Add more helper methods to be used by all tests here... 
    class ActionDispatch::IntegrationTest 
     # Make the Capybara DSL available in all integration tests 
     include Capybara::DSL 

     # Reset sessions and driver between tests 
     # Use super wherever this method is redefined in your individual test classes 
     def teardown 
     Capybara.reset_sessions! 
     Capybara.use_default_driver 
     end 
    end 

    class ActionController::TestCase 

     include Warden::Test::Helpers 
    include Devise::TestHelpers 

    def setup 
     @request.env['devise.mapping'] = Devise.mappings[:user] 
    end 

    end 

end 

答えて

0

のですか?

「ensure_sign_in」方法は

「上devise_auth_tokenヘルパーメソッドを呼び出し、その今働いアクション:)

前にあるdevise_auth_token宝石からヘルパーメソッド

allow(controller).to receive(:ensure_sign_in) 
関連する問題