为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 golang 中对 os/exec 的 cmd.Start() 进行单元测试?

如何在 golang 中对 os/exec 的 cmd.Start() 进行单元测试?

Go
holdtom 2022-10-31 15:53:13
我试图在单元测试中模拟 cmd.Start() 并且无法弄清楚我们需要模拟整个函数还是可以模拟 cmd.Start() 函数?有人可以帮助我吗?    package main        import (        "bytes"        "fmt"        "os/exec"    )        var execCommand = exec.Command    func main() {        stdout := &bytes.Buffer{}        cmd := execCommand("cmd")        syscall.SysProcAttr := &syscall.SysProcAttr{CmdLine: "/S /c C:\\Temp\\test.exe /S C:\\Temp\\test.log"}        cmd.Stdout = stdout            errs := cmd.Start()        if errs != nil {            fmt.Println("command run fialed :", errs)            fmt.Println("OUTPUT :", stdout.String())        }        }单元测试:func fakeExecCommand(command string, args ...string) *exec.Cmd {    cs := []string{"-test.run=TestExecCommandHelper", "--", command}    cs = append(cs, args...)    cmd := exec.Command(os.Args[0], cs...)    es := strconv.Itoa(mockedExitStatus)    cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1", "STDOUT=" + mockedStdout, "EXIT_STATUS=" + es}    return cmd}
查看完整描述

1 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

我无法模拟 cmd.Start(),无论如何我们都不能这样做,下面是对我有用的方式。


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

            cs := []string{"-test.run=TestExecCommandHelper", "--", "ENTER YOUR COMMAND HERE"}

            cs = append(cs, args...)

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

            es := strconv.Itoa(mockedExitStatus)

            cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1", "STDOUT=" + mockedStdout, "EXIT_STATUS=" + es}

            return cmd

        }

    

    

    

        func TestPrintDate(t *testing.T) {

            mockedExitStatus = 1

            mockedStdout = "Sun Aug 201"

            execCommand = fakeExecCommand

            defer func() { execCommand = exec.Command }()

            expDate := "Sun Aug 20"

        

            out, _ := printDate()

            if string(out) != expDate {

                t.Errorf("Expected %q, got %q", expDate, string(out))

            }

        }


/////////CODE///////


    func printDate() ([]byte, error) {

        cmd := execCommand("date")

        out, err := cmd.CombinedOutput()

        return out, err

    }


查看完整回答
反对 回复 2022-10-31
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信