【问题标题】:How do I bypass recaptcha verification in rails controller w/ RSPEC?如何绕过带有 RSPEC 的 Rails 控制器中的 recaptcha 验证?
【发布时间】:2020-11-28 03:28:39
【问题描述】:

在我的 rails UsersController - users#sign_up 操作中,我执行验证以确保用户拥有有效的 recaptcha v3 令牌,然后再继续执行控制器逻辑的其余部分。如果 recaptcha 验证失败,则控制器返回并以错误消息响应。但是,我的 rspec 测试失败了,因为我不确定如何模拟/绕过控制器中的验证。

spec/requests/auth_spec.rb:

RSpec.describe "Authentication Requests", type: :request do
  context "sign up user" do
    it "fails to sign up a user without email address" do
      headers = { :CONTENT_TYPE => "application/json" }
      post "/api/v1/sign_up", :params => { :email => nil, :password => "password123"}.to_json, :headers => headers
      expect(response.header['Content-Type']).to include('application/json')
      expect(response_body_to_json).to eq({"error"=>"Failed to create user"})
    end
  end
end

当我发布到 /api/v1/sign_up 时测试失败,因为缺少 recaptcha 令牌的参数。据我了解,无法模拟 recaptcha v3 令牌。因此,最好让verify_recaptcha 返回true 进行 rspec 测试。

controllers/api/v1/users_controller:

def sign_up
  # Rspec fails here with missing params error
  return if !verify_recaptcha('sign_up', recaptcha_params[:token])

  @user = User.new(user_credential_params)

  if @user.valid?
    # Handle success/fail logic
  end
end

private

def user_credential_params
  params.permit(:email, :password)
end

def recaptcha_params
  params.permit(:token)
end

controllers/concerns/users_helper.rb:

def verify_recaptcha(recaptcha_action, token)
  secret_key = Rails.application.credentials.RECAPTCHA[:SECRET_KEY]

  uri = URI.parse("https://www.google.com/recaptcha/api/siteverify?secret=#{secret_key}&response=#{token}")
  response = Net::HTTP.get_response(uri)

  json = JSON.parse(response.body)

  recaptcha_valid = json['success'] && json['score'] > 0.5 && json['action'] == recaptcha_action

  if !recaptcha_valid
    render :json => { :error_msg => 'Authentication Failure' }, :status => :unauthorized
    return false
  end

  return true
end

我能否存根/模拟来自users_helper 关注点的verify_recaptcha 方法以返回true?有没有更好的方法来做到这一点?

在问这个问题之前我做了尽职调查,我发现了这个帖子:mocking/stubbing a controller recaptcha method with rspec in rails

这是该帖子的答案:

allow(controller).to receive(:verify_recaptcha).and_return(true)

以上方法对我不起作用,因为个人在ApplicationController.rb 中有他们的verify_recaptcha 方法(在我看来这似乎有点脏)。鉴于我的 verify_recaptcha 方法在关注点内,我不确定如何通过 Rspec 访问关注点。

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    您可以尝试将UserController.expects(:verify_recaptcha).returns(true) 添加到您的测试中。 这将绕过 recaptcha 或者只是尝试查找 verify_recaptcha 方法存在的位置,然后在中的 expect 方法之前写入控制器或类名 UserController.expects(:verify_recaptcha).returns(true)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 2015-03-08
      • 1970-01-01
      相关资源
      最近更新 更多