【发布时间】:2020-06-23 11:47:14
【问题描述】:
我正在尝试模拟 Stripe 进行一些测试。
//testify mock
type Backend struct {
mock.Mock
}
func (s Backend) Call(method, path, key string, params stripe.ParamsContainer, v interface{}) error {
args := s.Called(params)
return args.Error(0)
}
func (s Backend) CallRaw(method, path, key string, body *form.Values, params *stripe.Params, v interface{}) error {
args := s.Called(params)
return args.Error(0)
}
func (s Backend) CallMultipart(method, path, key, boundary string, body *bytes.Buffer, params *stripe.Params, v interface{}) error {
args := s.Called(params)
return args.Error(0)
}
func (s Backend) SetMaxNetworkRetries(maxNetworkRetries int) {
s.Called(maxNetworkRetries)
}
然后在测试初始化:
//stripe
backend := new(mock.Backend)
backend.On("CallRaw", testify.Anything, testify.Anything, testify.Anything, testify.Anything, testify.Anything).
Return(nil)
backend.On("Call",
testify.
MatchedBy(func(req stripe.ParamsContainer) bool {
customerParams, ok := req.(*stripe.CustomerParams)
if ok {
return *customerParams.Email == "failure@email.com"
}
return false
})).
Return(fmt.Errorf("downstream stripe error"))
backend.On("Call",
testify.
MatchedBy(func(req stripe.ParamsContainer) bool {
customerParams, ok := req.(*stripe.CustomerParams)
if ok {
return *customerParams.Email == "success@email.com"
}
return false
})).
Return(nil)
sc := &client.API{}
sc.Init("", &stripe.Backends{
API: backend,
Connect: backend,
Uploads: backend,
})
这行得通 - 但我不知道如何模拟才能真正获得客户?我不想嘲笑client.API。 API代码:https://github.com/stripe/stripe-go/blob/9c5fd87e31fd4a072b4d92571d67437e329dc9db/customer/client.go#L23
还有其他人这样做吗? :)
谢谢
【问题讨论】:
-
我是 - 但这更多用于单元测试 - 我实际上只是在 Stripe 方法周围实现了一个薄包装......我对这种方法很好。对于功能测试,将使用 stripe-mock。
标签: go stripe-payments testify