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

如何在 Go 中测试 os.exit 场景

如何在 Go 中测试 os.exit 场景

Go
MMMHUHU 2021-08-23 15:25:05
鉴于此代码func doomed() {  os.Exit(1)}我如何正确测试调用此函数将导致使用退出go test?这需要在一组测试中发生,换句话说,os.Exit()调用不会影响其他测试,应该被捕获。
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

我通过使用bouk/monkey来做到这一点:


func TestDoomed(t *testing.T) {

  fakeExit := func(int) {

    panic("os.Exit called")      

  }

  patch := monkey.Patch(os.Exit, fakeExit)

  defer patch.Unpatch()

  assert.PanicsWithValue(t, "os.Exit called", doomed, "os.Exit was not called")

}

在处理这类工作、故障注入和其他困难任务时,monkey 是超级强大的。它确实带有一些警告。


查看完整回答
反对 回复 2021-08-23
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

我认为如果os.Exit不从外部(使用exec.Command)过程模拟测试,就无法测试实际情况。

也就是说,您可以通过创建接口或函数类型,然后在测试中使用 noop 实现来实现您的目标:

package main


import "os"

import "fmt"


type exiter func (code int)


func main() {

    doExit(func(code int){})

    fmt.Println("got here")

    doExit(func(code int){ os.Exit(code)})

}


func doExit(exit exiter) {

    exit(1)

}


查看完整回答
反对 回复 2021-08-23
  • 3 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

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