猿问

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

我试图在单元测试中模拟 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

}


holdtom
浏览 124回答 1
1回答

倚天杖

我无法模拟 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    }
随时随地看视频慕课网APP

相关分类

Go
我要回答