- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定以下用 Go 编写的简单 lambda,它只返回一个表描述...
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"strings"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"go.uber.org/zap"
)
var (
dynamoDBTableName = aws.String(os.Getenv(EnvDynamoDBTableName))
logger = func() *zap.Logger {
l, err := zap.NewProduction()
if err != nil {
log.Printf("failed to create zap logger: %v", err)
}
return l
}()
)
func handler(ctx context.Context, req events.APIGatewayProxyRequest)
(events.APIGatewayProxyResponse, error) {
defer logger.Sync()
resp := events.APIGatewayProxyResponse{}
cfg, err := config.LoadDefaultConfig(ctx)
if err != nil {
logger.Error("failed to load AWS config", zap.Error(err))
return resp, fmt.Errorf("failed to load AWS config: %w", err)
}
svc := dynamodb.NewFromConfig(cfg)
// fake logic
t, err := svc.DescribeTable(ctx, &dynamodb.DescribeTableInput{TableName: dynamoDBTableName})
if err != nil {
logger.Error("failed to describe table", zap.String("table-name", *dynamoDBTableName), zap.Error(err))
}
var sb strings.Builder
enc := json.NewEncoder(&sb)
err = enc.Encode(t.Table)
if err != nil {
logger.Error("failed to JSON encode response", zap.Error(err))
}
resp.Body = sb.String()
resp.StatusCode = http.StatusOK
return resp, nil
}
func main() {
lambda.Start(handler)
}
...我如何在本地对其进行单元测试?使用旧的 SDK 可以像这样使用依赖注入(inject):
type deps struct
svc dynamodbiface.DynamoDBAPI
table string
}
func (d *deps) handler(ctx context.Context, req events.APIGatewayProxyRequest)
(events.APIGatewayProxyResponse, error) {
...
}
func main() {
s := session.Must(session.NewSession())
d := deps {
svc: dynamodb.New(s),
table: dynamoDBTableName,
}
lambda.Start(d.handler)
}
鉴于我需要上下文来加载 dynamodb.NewFromConfig
所需的配置,我该如何测试使用适用于 Go V2 的新 AWS SDK 编写的 lambda?
最佳答案
首先让你的处理程序成为一个不起眼的对象,这样我们就可以“跳过”测试它:
func handler(ctx context.Context, req events.APIGatewayProxyRequest)
(events.APIGatewayProxyResponse, error) {
dynamoWrapper := &RealDynamoWrapper{}
proxyController := &ProxyController{DynamoWrapper: dynamoWrapper}
return proxyController.proxy(ctx, req)
这个想法是通过将所有复杂性委托(delegate)给 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
}
现在这个包装器的真正实现,上面提到的 RealDynamoWrapper
将像您对 sdk 一样进行调用。不过,对于我们的测试,我们需要一个模拟实现:
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...)
}
最后,在您的测试中,您现在可以模拟 dynamo 调用:
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
}
关于unit-testing - 如何对使用适用于 Go V2 的 AWS 开发工具包实现的 Lambda 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66534288/
我在我的 Xcode 项目目录中输入了以下内容: keytool -genkey -v -keystore release.keystore -alias mykey -keyalg RSA \
假设我有一个像这样的 DataFrame(或 Series): Value 0 0.5 1 0.8 2 -0.2 3 None 4 None 5 None
我正在对一个 Pandas 系列进行相对繁重的应用。有什么方法可以返回一些打印反馈,说明每次调用函数时在函数内部进行打印还有多远? 最佳答案 您可以使用跟踪器包装您的函数。以下两个示例,一个基于完成的
我有一个 DataFrame,其中一列包含列表作为单元格内容,如下所示: import pandas as pd df = pd.DataFrame({ 'col_lists': [[1, 2
我想使用 Pandas df.apply 但仅限于某些行 作为一个例子,我想做这样的事情,但我的实际问题有点复杂: import pandas as pd import math z = pd.Dat
我有以下 Pandas 数据框 id dist ds 0 0 0 0 5 1 0 0 7 2 0 0
这发生在我尝试使用 Gradle 构建时。由于字符串是对象,因此似乎没有理由发生此错误: No signature of method: java.util.HashMap.getOrDefault(
您好,有人可以解释为什么在 remaining() 函数中的 Backbone 示例应用程序 ( http://backbonejs.org/examples/todos/index.html ) 中
我有两个域类:用户 class User { String username String password String email Date dateCreated
问题陈述: 一个 pandas dataframe 列系列,same_group 需要根据两个现有列 row 和 col 的值从 bool 值创建。如果两个值在字典 memberships 中具有相似
apporable 报告以下错误: error: unknown type name 'MKMapItem'; did you mean 'MKMapView'? MKMapItem* destina
我有一个带有地址列的大型 DataFrame: data addr 0 0.617964 IN,Krishnagiri,635115 1 0.635428 IN,Chennai
我有一个列表list,里面有这样的项目 ElementA: Number=1, Version=1 ElementB: Number=1, Version=2 ElementC: Number=1,
我正在编译我的源代码,它只是在没有运行应用程序的情况下终止。这是我得到的日志: Build/android-armeabi-debug/com.app4u.portaldorugby/PortalDo
我正在尝试根据另一个单元格的值更改单元格值(颜色“红色”或“绿色”)。我运行以下命令: df.loc[0, 'Colour'] = df.loc[0, 'Count'].apply(lambda x:
我想弄清楚如何使用 StateT结合两个 State基于对我的 Scalaz state monad examples 的评论的状态转换器回答。 看来我已经很接近了,但是在尝试申请 sequence
如果我已经为它绑定(bind)了集合,我该如何添加 RibbonLibrary 默认的快速访问项容器。当我从 UI 添加快速访问工具项时,它会抛出 Operation is not valid whi
在我学习期间Typoclassopedia我遇到了这个证明,但我不确定我的证明是否正确。问题是: One might imagine a variant of the interchange law
我是一名优秀的程序员,十分优秀!