2 回答

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊
您可以創(chuàng)建一個(gè)方法來初始化 db,并在 RUN arg 中使用該方法。請嘗試以下操作:
var versionCmd = &cobra.Command{
.....
Run: func(cmd *cobra.Command, args []string) {
db := initDB()
....
},
}
func initDB() *gorm.DB {
dir, _ := os.Getwd()
db, err := gorm.Open(sqlite.Open(fmt.Sprintf("%s/db/db.sqlite", dir)), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
return db
}
或者,如果該函數(shù)對于其他命令也是 gerenic,則可以提取該函數(shù)本身。Run
var versionCmd = &cobra.Command{
.....
Run: runFunc,
}
func runFunc(cmd *cobra.Command, args []string) {
// do everythig here
}

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
我建議采用以下方法:
type RunEFunc func(cmd *cobra.Command, args []string) error
func NewCmd(db *gorm.DB) *cobra.Command {
cmd := &cobra.Command{
...
RunE: runCmd(db),
}
return cmd
}
func runCmd(db *gorm.DB) RunEFunc {
return func(cmd *cobra.Command, args []string) error {
// Use db here
}
測試也非常容易:
func TestCmd(t *testing.T) {
db := // Open db
cmd := NewCmd(db)
cmd.SetArgs([]string{"any here"})
// You can also modify flags
if err := cmd.Execute(); err != nil {
t.Fatal(err)
}
}
有時(shí),出于測試目的,傳遞數(shù)據(jù)庫對象以外的其他參數(shù)非常方便。下面是一個(gè)實(shí)現(xiàn)及其測試。
- 2 回答
- 0 關(guān)注
- 91 瀏覽
添加回答
舉報(bào)