【问题标题】:Init function breaking unit tests初始化函数破坏单元测试
【发布时间】:2017-09-10 14:49:55
【问题描述】:

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

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

一些sn-ps来说明问题:

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() 函数中加载您的配置,原因是(测试问题)以及其他(结构、可重用性、控制等)。只需从您的入口点调用 loadConfig()。

标签: unit-testing go


【解决方案1】:

我不确定是否有更好的方法来执行此操作,但是如果您考虑到包级变量在运行 init func 之前已初始化的事实,您可以使用一个标志来告诉您是否是是否运行测试。

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

【讨论】:

  • 感谢您的回答。我决定不使用init()。在 New 函数中调用 loadConfig 并在该函数中返回错误似乎更合适。
  • 在某些情况下,我使用它来测试 GCP 云功能。由于我的函数的全局依赖项在func init() 中初始化,使用这种方法,我可以首先在测试文件中模拟它们,对真实代码的唯一更改是检查deps 是否已经初始化,如果是,跳过真正的初始化。如果有人有更好或更“正确”的方式,我会全力以赴
猜你喜欢
  • 2013-03-21
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多