测试函数以读取特定的 JSON 配置文件

Testing a func to read a specific JSON config file

提问人:Coldchain9 提问时间:2/28/2023 最后编辑:Coldchain9 更新时间:3/7/2023 访问量:92

问:

我是 Go 测试的新手,正在尝试测试读取 JSON 配置文件(用于 Snowflake)的 JSON 配置文件。func

我已经阅读了几个建议使用界面的问题,但我不能完全说明为什么这样做是有意义的,以及如何成功地做到这一点。io.Reader

这是我的方法:

package helpers


import (
    "encoding/json"
    "io"
    "log"
    "os"
    "fmt"
)

type SfConfig struct {
    User      string `json:"user"`
    Password  string `json:"password"`
    Account   string `json:"account"`
    Warehouse string `json:"warehouse"`
    Database  string `json:"database"`
    Schema    string `json:"schema"`
    Role      string `json:"role"`
}

func ReadSnowflakeConfig(fp string) (string, error) {
    var config SfConfig
    file, err := os.Open(fp)
    if err != nil {
        log.Fatalln("Could not open Snowflake credentials file.")
        return "", err
    }
    defer file.Close()
    data, err := io.ReadAll(file)
    if err != nil {
        log.Fatalln("Could not read Snowflake credentials file.")
        return "", err
    }
    json.Unmarshal(data, &config)

    // Prepare our snowflake DB connection string
    connString := fmt.Sprintf(
        "%s:%s@%s/%s/%s?warehouse=%s&role=%s",
        config.User,
        config.Password,
        config.Account,
        config.Database,
        config.Schema,
        config.Warehouse,
        config.Role,
    )
    return connString, nil
}

实际test.json文件:

{
    "account": "account",
    "user": "username",
    "password": "password",
    "role": "CRUD_ROLE",
    "warehouse": "WHS",
    "database": "DB",
    "schema": "schema"
}
单元测试 go 测试 io

评论

0赞 Adrian 2/28/2023
“我不能完全解释为什么这样做是有意义的”——因为你的生产代码可以使用一个真实的文件来调用它,而你的测试代码可以传入一个或,并传入配置作为文本值。os.Openbytes.Readerstrings.Reader
0赞 Coldchain9 2/28/2023
@Adrian,所以你会使用操作系统。open() 在调用中?该组件是否也需要测试?func
3赞 Adrian 2/28/2023
右。我不会费心测试什么都不做的代码,只是调用已经有自己的测试的 stdlib 函数。我不需要在我的项目中进行单元测试,它只是确认它确实按照锡上所说的去做,如果我可以避免的话,我不想要与文件系统交互的单元测试。os.Open

答:

0赞 AngelX 3/7/2023 #1

您必须更改 func 签名才能使函数可测试。

你的 func 应该对它需要配置的地方有一些抽象,所以我的建议是使用这样的东西

func (reader io.Reader) (string, error) {
 ... 
}

或者只是将测试配置文件传递给测试中的方法,即单独的方法。