猿问

单元测试在返回取消引用的结构属性而不是结构时死机

如何测试返回字符串或数字类型的结构属性而不是结构本身的函数?


我正在尝试用块测试块。Lambda CodeTest Code


在下面的块中,我返回*resp。UserPoolClient.ClientSecret 它取消引用 到 ,而不是 .Lambda Codestring*string


当我运行测试时,我相信我得到了一个紧急错误,就像在调试器中一样。*resp.UserPoolClient.ClientSecretnil


我返回的取消引用属性是错误的方法吗?想知道我是否最好只返回整个 resp 对象,而不是取消引用?我这样做是因为我根本不需要修改值,只需要副本可供参考。


Lambda Code


package main

 

import (

    "fmt"

    "log"

    "os"

 

    "github.com/aws/aws-sdk-go/aws"

    "github.com/aws/aws-sdk-go/aws/awserr"

    "github.com/aws/aws-lambda-go/lambda"

    "github.com/aws/aws-sdk-go/aws/session"

    cidp "github.com/aws/aws-sdk-go/service/cognitoidentityprovider"

    cidpif "github.com/aws/aws-sdk-go/service/cognitoidentityprovider/cognitoidentityprovideriface"

    util "github.com/sean/repo/internal/util"

)

 

type application struct {

    config configuration

}

 

type configuration struct {

    ClientPoolID string

    UserPoolID   string

    idp          cidpif.CognitoIdentityProviderAPI

}

 

func (app application) getUserPoolClientSecret() (string, error) {

    input := &cidp.DescribeUserPoolClientInput{

        UserPoolId: aws.String(app.config.UserPoolID),

        ClientId:   aws.String(app.config.ClientPoolID),

    }

 

    resp, err := app.config.idp.DescribeUserPoolClient(input)

    if err != nil {

        if aerr, ok := err.(awserr.Error); ok {

            log.Printf("[ERROR] %v", aerr.Error())

        } else {

            log.Printf("[ERROR] %v", err.Error())

        }

        return "", err

    }

    log.Println("[INFO] Obtained user pool client secret successfully")

    return *resp.UserPoolClient.ClientSecret, nil

}


// omitted for brevity

 

func main() {

    config := configuration{

        ClientPoolID: os.Getenv("CLIENT_POOL_ID"),

        UserPoolID:   os.Getenv("USER_POOL_ID"),

        idp:          cidp.New(session.Must(session.NewSession())),

    }

 

    app := application{config: config}

 

    lambda.Start(app.handler) // handler() calls app.getUserPoolClientSecret

}


隔江千里
浏览 106回答 1
1回答

慕娘9325324

我返回的取消引用属性是错误的方法吗?就个人而言,我不认为这是错的。我也会这样做。但更有经验的Go开发人员也许能够在这里提供更细致入微和详细的答案。关于恐慌,我认为问题在于您创建的模拟不会返回所有必需的信息。您的模拟:idpMock := mockDescribeUserPoolClient{    Response: &cidp.DescribeUserPoolClientOutput{},    Error:    nil,}您只需创建 的“空”实例。但是,您要测试的代码确实访问了两个未定义的子代码:DescribeUserPoolClientOutputUserPoolClient(结构引用)ClientSecret(字符串引用)您的验证码:*resp.UserPoolClient.ClientSecret所以你的模拟也需要模拟这些:idpMock := mockDescribeUserPoolClient{    Response: &cidp.DescribeUserPoolClientOutput{        UserPoolClient: &cidp.UserPoolClientType{            ClientSecret: aws.String("example-secret")        }    },    Error:    nil,}这应该可以解决您的恐慌。
随时随地看视频慕课网APP

相关分类

Go
我要回答