如何正确测试创建Stripe customer的API?stripe-ruby-mock该如何使用?
第一步:安装依赖
- 在Gemfile的
test分组下添加如下配置,之后执行bundle install安装即可
group :test do gem 'stripe-ruby-mock', require: 'stripe_mock' end
第二步:编写测试用例(以下以Rails常用的RSpec框架为例,MiniTest思路完全一致)
stripe-ruby-mock的核心原理是拦截所有发往Stripe官方的请求,在本地模拟Stripe的返回逻辑,不需要真实调用接口也不需要联网。
完整的controller测试代码示例如下:
require 'rails_helper' require 'stripe_mock' RSpec.describe UsersController, type: :controller do # 每个测试用例运行前开启stripe mock,运行后清空状态避免用例互相干扰 before { StripeMock.start } after { StripeMock.stop } describe 'POST #create' do let(:valid_params) do { email: 'test@example.com', first_name: '张', last_name: '三' } end context '参数合法且Stripe调用成功' do it '成功创建用户并绑定stripe customer id' do post :create, params: valid_params # 断言接口返回正常 expect(response).to have_http_status(:ok) json = JSON.parse(response.body) expect(json.dig('user', 'email')).to eq(valid_params[:email]) # 断言数据库用户数据正确 user = User.last expect(user.email).to eq(valid_params[:email]) expect(user.stripe_customer_id).to be_present # 断言模拟的Stripe侧确实创建了对应信息的客户 stripe_customer = Stripe::Customer.retrieve(user.stripe_customer_id) expect(stripe_customer.email).to eq(valid_params[:email]) expect(stripe_customer.name).to eq('张 三') end end context 'Stripe调用异常时' do it '验证异常分支逻辑' do # 模拟Stripe返回参数错误异常 StripeMock.prepare_error(Stripe::InvalidRequestError.new('参数错误', :email), :create_customer) expect { post :create, params: valid_params }.not_to change(User, :count) # 这里也可以加断言接口返回错误状态码,你当前的controller代码没有做异常捕获,这个用例如果跑失败,可以提醒你补充事务/异常处理逻辑,避免出现用户创建成功但Stripe绑定失败的脏数据 end end end end
补充说明
你当前的controller实现存在数据一致性风险:如果Stripe::Customer.create调用失败,前面已经创建的User不会自动回滚,会产生没有绑定stripe_customer_id的无效用户。建议将两个操作放在同一个事务里,或者先调用Stripe接口成功后再创建用户。
内容的提问来源于stack exchange,提问作者Remy Wang
相关产品推荐
相关产品推荐

