Go 戈兰的单元测试模式识别

Go 戈兰的单元测试模式识别,go,Go,我正在构建使用os.Exit(1)的应用程序的单元测试,一旦os.Exit(1)执行,剩余的测试文件将被go测试跳过, 我正在考虑仅在单元测试执行期间禁止os.Exit。我想知道如何确定应用程序是从go test runner引导的?您将找到各种方法,在“”中使用os.Exit()对测试方法进行单元测试 它使用的函数是: os.Exit()不测试时 var osExit = os.Exit 在测试时使用“yourOsExit” func TestCrasher(t *testing.T)

我正在构建使用os.Exit(1)的应用程序的单元测试,一旦os.Exit(1)执行,剩余的测试文件将被go测试跳过,
我正在考虑仅在单元测试执行期间禁止os.Exit。我想知道如何确定应用程序是从go test runner引导的?

您将找到各种方法,在“”中使用os.Exit()对测试方法进行单元测试

它使用的函数是:

  • os.Exit()
    不测试时

    var osExit = os.Exit
    
  • 在测试时使用“yourOsExit”

    func TestCrasher(t *testing.T) {
        // Save current function and restore at the end:
        oldOsExit := osExit
        defer func() { osExit = oldOsExit }()
        osExit = myExit
    

一般来说,您正在寻找“模拟”API。不要在注释中添加代码;这是不可读的。请编辑您的问题并将其正确格式化。不要这样做。测试中的代码必须与生产中的代码在测试中100%相同。否则,您将执行无效的测试。如果您有一个函数在生产过程中退出,但在测试过程中不退出,那么您的代码组织不正确。将出口移出正在测试的代码,以便测试的代码在测试和产品环境中都能相同地工作。@Flimzy你怎么说不要这样做?“必须”是一个很强的词,解释无效,这是你的观点吗?@AdrianWitas:如果你想测试一个函数是否在生产环境中工作,你必须(没有其他词)在同样有意义的条件下测试它。你能提供更多的细节吗?如果该链接失效,这个答案实际上是无用的。@JonathonReinhart完成了,但请注意该链接指向另一个堆栈溢出问题:它不会消亡/腐烂。@VonC好的。那么,为什么不投票将其作为一个副本关闭呢?各种问题可能会以不同的方式解决,帖子特别询问单元测试标识模式,因此没有重复,尽管模仿OsExit可能是解决它的一个更简单的方法,但此解决方案也适用于其他问题,因此帖子提交。