[英]How do I bypass recaptcha verification in rails controller w/ RSPEC?
在我的 rails UsersController
- users#sign_up
操作中,我執行驗證以確保用戶擁有有效的 recaptcha v3 令牌,然后再轉到 controller 邏輯的 rest。 如果 recaptcha 驗證失敗,則 controller 返回並以錯誤消息響應。 但是,我的rspec
測試失敗了,因為我不確定如何模擬/繞過 controller 中的驗證。
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 令牌。 因此,對於 rspec 測試,最好讓verify_recaptcha
返回true
。
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 訪問關注點。
您可以嘗試將UserController.expects(:verify_recaptcha).returns(true)
添加到您的測試中。 這將繞過 recaptcha 或只是嘗試查找 verify_recaptcha 方法存在的位置,然后在UserController.expects(:verify_recaptcha).returns(true)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.