私のユーザ認証には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