亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何模擬 *exec.Cmd / exec.Command()?

如何模擬 *exec.Cmd / exec.Command()?

Go
Qyouu 2022-11-08 15:43:17
我需要嘲笑exec.Command()。我可以使用以下方法模擬它:var rName stringvar rArgs []stringmockExecCommand := func(name string, arg ...string) *exec.Cmd {    rName = name    rArgs = arg    return nil}但是,這在實際代碼中不起作用,因為它抱怨 nil 指針,因為返回exec.Cmd調用Run().我試圖像這樣模擬它:type mock exec.Cmdfunc (m *mock) Run() error {    return nil}var rName stringvar rArgs []stringmockExecCommand := func(name string, arg ...string) *exec.Cmd {    rName = name    rArgs = arg    m := mock{}    return &m}但它抱怨:cannot use &m (value of type *mock) as *exec.Cmd value in return statementcompilerIncompatibleAssign.有沒有辦法解決這個問題?有沒有更好的模擬方法exec.Command()?如果我返回一個“模擬”命令,模擬函數就可以工作,盡管我Run()也更喜歡控制這個函數:var rName stringvar rArgs []stringmockExecCommand := func(name string, arg ...string) *exec.Cmd {    rName = name    rArgs = arg    return exec.Command("echo")}
查看完整描述

3 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

雖然劫持測試可執行文件以運行特定功能是可行的,但僅使用常規依賴注入會更直接。不需要魔法。

設計一個可以運行命令的界面(例如CommandExecutor),然后將其中一個作為您的輸入,用于運行命令所需的任何功能。然后,您可以在測試期間提供滿足接口(手工制作或使用您選擇的工具生成,如 GoMock)的模擬實現。為您的生產代碼提供真正的實現(調用exec包)。您的模擬實現甚至可以對參數進行斷言,以便您知道命令正在正確“執行”。


查看完整回答
反對 回復 2022-11-08
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

實際上有一種方法可以做到這一點。所有功勞歸于這篇文章。查看它以了解以下發生的情況:


func fakeExecCommand(command string, args...string) *exec.Cmd {

    cs := []string{"-test.run=TestHelperProcess", "--", command}

    cs = append(cs, args...)

    cmd := exec.Command(os.Args[0], cs...)

    cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}

    return cmd

}


func TestHelperProcess(t *testing.T){

    if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {

        return

    }

    os.Exit(0)

}


查看完整回答
反對 回復 2022-11-08
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

如何模擬 *exec.Cmd / exec.Command()?

你不能。提出一個非基于模擬的測試策略。


查看完整回答
反對 回復 2022-11-08
  • 3 回答
  • 0 關注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號