如何在go中测试退出代码而不退出测试用例,当退出代码是!= 0

hzbexzde  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(134)

我正在尝试用go编写一个单元测试,用于返回非零退出代码的函数。我正在用cobra开发一个CLI应用程序来验证语义版本。如果验证失败,我将返回JSON格式的一些信息,并使用os.Exit(1)退出。
现在,我想测试一下这是否真的如预期的那样工作。在我的测试中,我通过了一个应该成功并返回0的数据集和一个应该失败并返回1的数据集。但是应该返回1的测试总是取消测试,因此取消所有后续迭代。这是我的代码:

func Test_ShouldGetCorrectExitCode(t *testing.T) {
    testCases := []struct {
        args          []string
        shouldBeValid bool
    }{
        {[]string{"0.1.0"}, false},
        {[]string{"v0.1.0"}, true},
    }
    for _, tc := range testCases {
        assert := assert.New(t)

        cmd := NewCmdValidate()
        cmd.SetArgs(tc.args)
        err := cmd.Execute()

        assert.Nil(err)
    }
}

到目前为止,Assert还不是很复杂,因为我没有让测试以我期望的方式运行。有谁知道我怎么在围棋里测试退出密码吗?

anauzrmj

anauzrmj1#

最好的解决方案是不要在测试函数中调用os.Exit。一个好的做法是只从main()调用os.Exit,而让函数返回一个退出状态,这可以很容易地测试。范例:

func main() {
    os.Exit(run())
}

func run() int {
  /* Things to test here */
}

在你的测试中:

func TestRun(t *testing.T) {
    t.Run("should succeed", func(t *testing.T) {
        status := run()
        if status != 0 {
            t.Errorf("Unexpected exit status: %d", status)
    })
    t.Run("should fail", func(t *testing.T) {
        status := run()
        if status != 1 {
            t.Errorf("Unexpected status code: %d", status)
        }
    })
}

相关问题