简体   繁体   English

从ApplicationController中的InvalidAuthenticityToken抢救Rails的Minitest

[英]Rails Minitest for rescue_from InvalidAuthenticityToken in ApplicationController

Hey I am currently using the minitest framework that is built into rails. 嘿,我目前正在使用内置在rails中的最小测试框架。 Trying to test some methods in my ApplicationController around protect_from_forgery and recovering from InvalidAuthenticityToken exceptions. 尝试在我的ApplicationController中测试一些关于protect_from_forgery的方法,并从InvalidAuthenticityToken异常中恢复。 For reference my ApplicationController looks like: 供参考,我的ApplicationController看起来像:

  class ApplicationController < ActionController::Base

      # Prevent CSRF attacks by raising an exception.
      # For APIs, you may want to use :null_session instead.
      protect_from_forgery with: :exception

      rescue_from ActionController::InvalidAuthenticityToken, with: :handle_invalid_token

     def access_denied(exception)
       redirect_to root_path, :alert => exception.message
     end

      protected

        def handle_invalid_token
          flash[:alert] = I18n.translate('devise.failure.invalid_token')
          redirect_to new_user_session_path
        end
   end

I am looking for away to test both the rescue_from ActionController::InvalidAuthenticityToken and the protect_from_forgery with: :exception methods. 我正在寻找用::exception方法测试result_from ActionController :: InvalidAuthenticityToken和protect_from_forgery的方法。 Is it possible to mock some of these things up with minitest, forgive me for my experience is limited to just basic model/controller/view testing. 是否可以用minitest模拟其中的某些内容,请原谅我的经验仅限于基本模型/控制器/视图测试。

Not much here but figured i would include the class for my ApplicationControllerTest 这里没有多少但是我想我会为我的ApplicationControllerTest包含类

require 'test_helper'

class ApplicationControllerTest < ActionController::TestCase

  test 'invalid access token' do

  end

end

I did this by stubbing out a testing controller like so: 我通过像这样测试控制器来做到这一点:

class StubController < ApplicationController

  def authenticate_user
    authenticate_user!
    head 200
  end

  def authenticate_user_invalid
    authenticate_user!
  end
end

Rails.application.routes.disable_clear_and_finalize = true

# Create a new route for our new action
Rails.application.routes.draw do
  get 'authenticate_user', to: 'stub#authenticate_user'
  get 'authenticate_user_invalid', to: 'stub#authenticate_user_invalid'
end

class StubControllerTest < ActionController::TestCase

   test 'authenticate_user sets current_user if valid user token and email' do
    user = users(:authenticatable_user)
    @request.headers['Authorization'] = "Token token=#{user.token},email=#{user.email_address}"

    get :authenticate_user
    assert_equal user, assigns(:current_user)
  end
end

The stub controller just subclasses the ApplicationController which I then add routes to the a madeup action that will trigger the actual method I want to test. 存根控制器只是将ApplicationController子类化,然后我将其路由添加到一个makeup操作中,该操作将触发我要测试的实际方法。 If everything goes as planned you can test the side effects to see if it worked. 如果一切按计划进行,您可以测试副作用,看看是否有效。 Hopefully this gives you enough info that you can hack it to work for your needs. 希望这可以为您提供足够的信息,以便您可以对其进行破解以适合您的需求。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM