unit-testing - 初始化函数中断单元测试

标签 unit-testing go

在我要测试的包中,我有一个 init 函数,它加载配置文件,其中包含一些我想用来运行我的应用程序的东西。但是,我不想在运行单元测试时触发此 init 函数。

有什么方法可以跳过或阻止在单元测试期间调用此 init 函数吗?

一些片段来说明这个问题:

func init() {
    var err error // Necessary to prevent config variable shadowing
    config, err = loadConfig("./client/config.yml")
    if err != nil {
        log.Fatal(err)
    }
}

func loadConfig(filepath string) (*Config, error) {
    viper.SetConfigFile(filepath)
    if err := viper.ReadInConfig(); err != nil {
        return nil, fmt.Errorf("Error loading config file: %s", err)
    }
  (...)
}

// New returns a Config value(!)
func New() Config {
    return *config
}

一个测试用例:

func TestNew(t *testing.T) {
    expected := &Config{}
    observed := New()
    if !reflect.DeepEqual(observed, expected) {
        t.Errorf("observed %+v. expecting %+v\n", observed, expected)
    }
}

最佳答案

我不确定是否有更好的方法来做到这一点,但如果你考虑到包级变量在 init 函数运行之前初始化的事实,你可以使用一个标志来告诉你是否正在运行测试。

var _testing = false

func init() {
    if _testing {
        return
    }

    var err error // Necessary to prevent config variable shadowing
    config, err = loadConfig("./client/config.yml")
    if err != nil {
        log.Fatal(err)
    }
}

// ...

在你的测试文件中你可以做这样的事情:

// not nice but works
var _ = (func() interface{} {
    _testing = true
    return nil
}())

func TestNew(t *testing.T) {
    expected := &Config{}
    observed := New()
    if !reflect.DeepEqual(observed, expected) {
        t.Errorf("observed %+v. expecting %+v\n", observed, expected)
    }
}

您可以在此处阅读有关初始化顺序的更多信息:https://golang.org/ref/spec#Program_initialization_and_execution

关于unit-testing - 初始化函数中断单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43409919/

相关文章:

go - Go 编译可执行文件巨大的原因

c# - 我是否应该测试我的 Controller 的 Action 方法是否正在调用存储库方法并生成正确的 View ?

php - 解耦还是模拟?

unit-testing - 是否可以在 ColdFusion 中找到代码覆盖率?

http - 在浏览器选项卡中查询时如何保护 GET 请求

windows - 如何使用 Go 在 Windows 上请求管理员权限

c# - 在单元测试中检查控制台输出

c# - 单元测试的模型验证仅适用于字符串

go - Helm : Extra newline when using "include" for templating

go - 为什么 go 编译器说结构不满足接口(interface)?