Home > other >  How to unit test os/exec's cmd.Start() in golang?
How to unit test os/exec's cmd.Start() in golang?

Time:01-31

I'm trying to mock cmd.Start() in Unit test and could not able figure out

Do we need to mock the entire function or can we mock cmd.Start() function?

Can someone help me in this?

    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())
        }
    
    }

Unit Test:

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
}

CodePudding user response:

I was not able to mock cmd.Start(), we cannot do that anyway and below is the way which worked for me.

    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
    }

Referred below link :

How to mock exec.Command for multiple unit tests in Go lang?

  •  Tags:  
  • Related