3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊
雖然劫持測(cè)試可執(zhí)行文件以運(yùn)行特定功能是可行的,但僅使用常規(guī)依賴(lài)注入會(huì)更直接。不需要魔法。
設(shè)計(jì)一個(gè)可以運(yùn)行命令的界面(例如CommandExecutor
),然后將其中一個(gè)作為您的輸入,用于運(yùn)行命令所需的任何功能。然后,您可以在測(cè)試期間提供滿足接口(手工制作或使用您選擇的工具生成,如 GoMock)的模擬實(shí)現(xiàn)。為您的生產(chǎn)代碼提供真正的實(shí)現(xiàn)(調(diào)用exec
包)。您的模擬實(shí)現(xiàn)甚至可以對(duì)參數(shù)進(jìn)行斷言,以便您知道命令正在正確“執(zhí)行”。

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊
實(shí)際上有一種方法可以做到這一點(diǎn)。所有功勞歸于這篇文章。查看它以了解以下發(fā)生的情況:
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)
}

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
如何模擬 *exec.Cmd / exec.Command()?
你不能。提出一個(gè)非基于模擬的測(cè)試策略。
- 3 回答
- 0 關(guān)注
- 144 瀏覽
添加回答
舉報(bào)