为什么你写的代码总是有 Bug?用它来保证 Go 代码质量( 二 )

代码清单 1 展示了 SeedLists 函数及其如何创建测试数据 。list.List 定义了一个用于插入的数据表 。然后,将测试数据插入数据库 。为了帮助将插入的数据与测试期间进行的任何数据库调用的结果进行比较,测试数据集返回给调用方 。
接下来,我们看看将更多测试数据插入数据库的 SeedItems 函数 。
代码清单 2func SeedItems(dbc *sqlx.DB, lists []list.List) ([]item.Item, error) {    now := time.Now().Truncate(time.Microsecond)    items := []item.Item{        {            ListID:   lists[0].ID, // Grocery            Name:     "Chocolate Milk",            Quantity: 1,            Created:  now,            Modified: now,        },        {            ListID:   lists[0].ID, // Grocery            Name:     "mac and Cheese",            Quantity: 2,            Created:  now,            Modified: now,        },        {            ListID:   lists[1].ID, // To-do            Name:     "Write Integration Tests",            Quantity: 1,            Created:  now,            Modified: now,        },    }    for i := range items {        stmt, err := dbc.Prepare("INSERT INTO item (list_id, name, quantity, created, modified) VALUES ($1, $2, $3, $4, $5) RETURNING item_id;")        if err != nil {            return nil, errors.Wrap(err, "prepare item insertion")        }        row := stmt.QueryRow(items[i].ListID, items[i].Name, items[i].Quantity, items[i].Created, items[i].Modified)        if err = row.Scan(&items[i].ID); err != nil {            if err := stmt.Close(); err != nil {                return nil, errors.Wrap(err, "close psql statement")            }            return nil, errors.Wrap(err, "capture list id")        }        if err := stmt.Close(); err != nil {            return nil, errors.Wrap(err, "close psql statement")        }    }    return items, nil}代码清单 2 显示了 SeedItems 函数如何创建测试数据 。除了使用 item.Item 数据类型,该代码与清单 1 基本相同 。testdb 包中还有一个未提到的函数 Truncate 。
代码清单 3func Truncate(dbc *sqlx.DB) error {    stmt := "TRUNCATE TABLE list, item;"    if _, err := dbc.Exec(stmt); err != nil {        return errors.Wrap(err, "truncate test database tables")    }    return nil}


推荐阅读