gpt4 book ai didi

unit-testing - 模拟 context.Context 来测试 lambdacontext.FromContext

转载 作者:IT王子 更新时间:2023-10-29 00:57:34 24 4
gpt4 key购买 nike

我正在使用 aws-sdk-go 构建一个 aws lambda和 aws-lambda-go我遇到了一个小问题。

我想测试我的 lambda 处理程序。为此,我需要模拟一个有效的 context.Context包含 lamdacontext.LambdaContext 的有效属性并满足 lambdacontext.FromContext

我似乎找不到构建此类模拟的方法,因为 lambdacontext.FromContext 总是返回我 _, false

这是我的主程序,在 events.SNSEvent 上有一个简单的处理程序事件:

package main

import (
"context"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-lambda-go/lambdacontext"
)

func main() {
lambda.Start(handleRequest)
}

func handleRequest(ctx context.Context, snsEvent events.SNSEvent) error {
lc, ok := lambdacontext.FromContext(ctx); if !ok {
// Always false
...
return someErr
}
. . .
return nil
}

这是我对 handleRequest 的测试:

package main

import (
"context"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambdacontext"
"github.com/stretchr/testify/assert"
"gitlab.easy-network.it/meg/aml-rekognition/testdata"
"testing"
)

const imgMock = `
{
\"some_parameter\": \"some_value\"
}`

func TestHandleRequest(t *testing.T) {

c := context.Background()

ctxV := context.WithValue(c, "", map[string]interface{}{
"AwsRequestID" : "some_aws_id",
"InvokedFunctionArn" : "some_arn",
"Identity" : lambdacontext.CognitoIdentity{},
"ClientContext" : lambdacontext.ClientContext{},
})

snsEventMock := events.SNSEvent{
Records: []events.SNSEventRecord{
{
SNS: events.SNSEntity{
Message: imgMock,
},
},
},
}

err := handleRequest(ctxV, snsEventMock)
assert.NoError(t, err)

}

我还尝试了其他模拟,例如将带有这些参数的结构传递给它等,但我总是得到 false。例如,我也尝试过:

type TestMock struct {
AwsRequestID string
InvokedFunctionArn string
Identity lambdacontext.CognitoIdentity
ClientContext lambdacontext.ClientContext
}

func TestHandleRequest(t *testing.T) {

c := context.Background()

testMock := TestMock{
AwsRequestID : "some_aws_id",
InvokedFunctionArn : "some_arn",
Identity : lambdacontext.CognitoIdentity{},
ClientContext : lambdacontext.ClientContext{},
}

ctxV := context.WithValue(c, "", testMock)

. . .

}

查看了FromContext的源码,摸不着头脑。

// LambdaContext is the set of metadata that is passed for every Invoke.
type LambdaContext struct {
AwsRequestID string
InvokedFunctionArn string
Identity CognitoIdentity
ClientContext ClientContext
}

// An unexported type to be used as the key for types in this package.
// This prevents collisions with keys defined in other packages.
type key struct{}

// The key for a LambdaContext in Contexts.
// Users of this package must use lambdacontext.NewContext and
lambdacontext.FromContext

// instead of using this key directly.
var contextKey = &key{}

// FromContext returns the LambdaContext value stored in ctx, if any.
func FromContext(ctx context.Context) (*LambdaContext, bool) {
lc, ok := ctx.Value(contextKey).(*LambdaContext)
return lc, ok
}

当然,即使我只是将 context.Background() 传递给它,它也会返回 false

关于如何构建有效的 context.Contextlambdacontext.FromContext 返回 true 有什么想法吗?

最佳答案

lambda.FromContext()检查是否通过 context.Contextlambdacontext 中包含一个带有“私钥”的值包裹:

// An unexported type to be used as the key for types in this package.
// This prevents collisions with keys defined in other packages.
type key struct{}

// The key for a LambdaContext in Contexts.
// Users of this package must use lambdacontext.NewContext and lambdacontext.FromContext
// instead of using this key directly.
var contextKey = &key{}

// FromContext returns the LambdaContext value stored in ctx, if any.
func FromContext(ctx context.Context) (*LambdaContext, bool) {
lc, ok := ctx.Value(contextKey).(*LambdaContext)
return lc, ok
}

您无法访问此 key ,也无法“复制”它(您无法创建与此“私有(private)” key 相等的值)。

但是有一个简单的方法,只需使用 lambdacontext.NewContext()派生将具有此 key 的上下文:

// NewContext returns a new Context that carries value lc.
func NewContext(parent context.Context, lc *LambdaContext) context.Context {
return context.WithValue(parent, contextKey, lc)
}

所以解决方案:

ctx := context.Background()
// Add keys to your liking, then:
lc := new(lambdacontext.LambdaContext)
ctx = lambdacontext.NewContext(ctx, lc)

关于unit-testing - 模拟 context.Context 来测试 lambdacontext.FromContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50490782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com