【问题标题】:golang unit test: inner function parametersgolang单元测试:内部函数参数
【发布时间】:2017-03-02 01:00:43
【问题描述】:

我在 go 函数中有简单的工作流程,但是在进行单元测试时,我卡在将参数传递给内部函数,或者模拟内部函数返回结果。

代码:

package myFunc

import (
    myPackage
    bookPackage
)

func Init() (err error) {
    err = getResource(myPackage.GetPath())
    ...
}

func getResource(path string) (err error) {
    // get resource from path ...
    err := bookPackage.GetBook(path)
}

测试:

package myFunc

import "testing"

func TestInit(t *testing.T) {
    if err := Init(); err != nil {
        t.Fatal("test failed")
    }
}

结果:

--- FAIL: TestInit (0.00s)
Failed to read path ...

这种情况的一般解决方案是什么?例如,如果 getResource() 调用 getBooks() 并且它的参数来自另一个来源?

如何在不实际运行的情况下模拟 getBooks() 返回结果?

谢谢,

【问题讨论】:

    标签: testing go


    【解决方案1】:

    我假设这不是真正的代码,因为您正在调用未导出的函数? myPackage.getPath() 永远不会起作用。

    无论如何,我倾向于这样做的方式是导出我需要更改以进行测试的任何内容:

    package myPackage
    
    var Path string
    
    func init() {
        Path = "/path/to/default/path"
    }
    
    func GetPath() {
        return Path
    }
    

    然后当您测试时,您可以将该变量覆盖为您需要的任何值:

    package myFunc
    
    import (
        "testing"
        "myPackage"
    )
    
    func TestInit(t *testing.T) {
        myPackage.Path = "/test/path"
        if err := Init(); err != nil {
            t.Fatal("test failed")
        }
    }
    

    【讨论】:

    • 嗨,戴夫,感谢您的快速回复。我根据您的反馈修改了问题。
    • 内部函数 getResource(myPackage.GetPath()) 通过调用另一个函数获取其参数,而不是从 Init() 传入。我尝试在测试中对路径字符串进行硬编码,但仍然无法获取。
    猜你喜欢
    • 2015-07-09
    • 2018-03-19
    • 2021-09-26
    • 2015-11-13
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多