【发布时间】: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