我如何测试我的API创建条带客户正确?



我想测试创建Stripe客户的API请求。

控制器

def create
user = User.create(create_params)
stripe_customer = Stripe::Customer.create({
email: create_params[:email],
name: [create_params[:first_name], create_params[:last_name]].join(' ')
})
user.update(stripe_customer_id: stripe_customer.id)
render(json: { user: user }, status: :ok)
end
private
def create_params
params.permit(
:email,
:first_name,
:last_name
)
end

我看到有stripe-ruby-mock宝石,但我不确定如何使用它?

首先,您应该能够相信Stipe的gem在调用它时会做正确的事情。因此,不需要测试它们的create方法是否返回正确的结果。所以,所有你需要测试的是你正确地调用了他们的API。你所需要做的只是一个RSpec模拟。

因为你的代码在一个控制器中,你要么需要使用一个控制器规范,要么你需要将你的代码重构到另一个类中。我的偏好是重构。这就是我要在这里展示的

控制器

重构,将业务逻辑移到命令类中。

def create
user = CreateUser.new(create_params).perform
render(json: { user: user }, status: :ok)
end

CreateUser命令类

重构了一个位,只对数据库进行一次调用。

class CreateUser
attr_reader :params
def initialize(params)
@params = params
end
def perform
stripe_customer = Stripe::Customer.create({
email: params[:email], 
name: [params[:first_name], params[:last_name]].join(' ')
})
User.create(params.merge(stripe_customer_id: stripe_customer.id))
end
end

CreateUser命令类的规范文件

describe CreateUser do
subject(:create_user) { described_class.new(params)
let(:params) do
email: 'some@email.address', 
first_name: 'first', 
last_name: 'last'
end
describe 'perform' do 
let(:stripe_customer_id) { 123 }
before do
allow(Stripe::Customer).to receive(:create).and_return(stripe_customer_id)
allow(User).to receive(:create)
end
it 'creates a Stripe customer' do
create_user.perform
expect(Stripe::Customer).to have_received(:create).with(
email: 'some@email.address', 
name: 'first last'
)
end
it 'creates a user with a stripe customer id' do
create_user.perform
expect(User).to have_received(:create).with(
email: 'some@email.address',
first_name: 'first', 
last_name: 'last', 
stripe_customer_id: 123
)
end
end
end

相关内容

  • 没有找到相关文章

最新更新