1 回答

TA貢獻2080條經驗 獲得超4個贊
首先,使你的處理程序成為一個不起眼的對象,這樣我們就可以“跳過”測試它:
func handler(ctx context.Context, req events.APIGatewayProxyRequest)
(events.APIGatewayProxyResponse, error) {
dynamoWrapper := &RealDynamoWrapper{}
proxyController := &ProxyController{DynamoWrapper: dynamoWrapper}
return proxyController.proxy(ctx, req)
這個想法是使處理程序函數變得謙卑,方法是讓它將所有復雜性委托給 .proxyController
現在,讓我們考慮要測試的,我們需要先定義它:ProxyController
type ProxyController struct {
dynamoWrapper DynamoWrapper
}
func(controller *ProxyController) Proxy(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
// this is where your implementation lives that you need to mock stuff for
// We are mocking this line from your question
svc := controller.dynamoWrapper.NewFromConfig(...)
// do other stuff and then return something
return events.APIGatewayProxyResponse{}, nil
}
你可以看到我將依賴于一個包裝版本的dynamo,它看起來像這樣:
type DynamoWrapper interface {
NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client
}
現在,此包裝器的真正實現,上面引用的那個將像對 sdk 執行操作一樣進行調用。但是,對于我們的測試,我們想要一個模擬實現:RealDynamoWrapper
type mockDynamoWrapper struct {
NewFromConfigFunc func(aws.Config, ...func(*Options)) *Client
}
func(dynamoWrapper *mockDynamoWrapper) NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client {
return dynamoWrapper.NewFromConfigFunc(cfg, optFns...)
}
最后,在測試中,您現在可以模擬發電機調用:
func TestProxyController(t *testing.T) {
// given
dynamoWrapper := &mockDynamoWrapper{}
proxyController := &ProxyController{DynamoWrapper: mockDynamoWrapper}
request := events.APIGatewayProxyRequest{}
dynamoWrapper.NewFromConfigFunc = func(aws.Config, ...func(*Options)) *Client {
// setup your mock function to do whatever you want
}
// when
proxyController.proxy(context.Background, request)
// then do your asserts
}
- 1 回答
- 0 關注
- 112 瀏覽
添加回答
舉報