初始化函数破坏单元测试

2024-04-23

在我想要测试的包中,我有一个 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)
    }
}

我不确定是否有更好的方法来做到这一点,但是如果您考虑到包级变量在initfunc 运行后,您可以使用一个标志来告诉您是否正在运行测试。

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 https://golang.org/ref/spec#Program_initialization_and_execution

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初始化函数破坏单元测试 的相关文章

  • 在 Alpine 中找不到运行时/cgo

    In an alpine edge我安装的容器通过 RUN apk add no cache musl dev go 我试着跑go get github com golang protobuf protoc gen go then 这会导致
  • 如何将 JUnit 5 与 Gradle 结合使用?

    在成功运行 JUnit 4 测试后 我尝试将 JUnit 5 与 Gradle 一起使用 预期结果 JUnit 4 测试在输出中给出了很好的 通过 结果 并在build reports tests 实际结果 下面的 JUnit 5 测试不输
  • Python 包?

    好吧 我认为无论我做错了什么 它可能都是显而易见的 但我无法弄清楚 我已经阅读并重新阅读了有关包的教程部分 我唯一能想到的是这不起作用 因为我直接执行它 这是目录设置 eulerproject init py euler1 py euler
  • 使用 jest 存根函数

    有没有办法使用 jest API 来存根函数 我习惯于使用 sinon 存根 在这里我可以使用存根为来自我的测试单元的任何函数调用编写单元测试 http sinonjs org releases v1 17 7 stubs http sin
  • 使用 google.protobuf.Timestamp 在 Go 中解析带有时区偏移的日期时间戳

    我正在创建一个将使用 GRPC 和 protobuf 的 Go 应用程序 我的 RPC 服务应获取包含类型的消息google protobuf Timestamp 解析它并最终将其保存在数据库中或对其执行更多操作 我对什么被认为是该类型的有
  • 用于测试的嵌入式 H2 数据库的 Spring 配置

    使用 Spring 进行集成测试的配置是什么样的 嵌入式 h2 数据源 http www h2database com html main html以及可选的 JUnit 我第一次尝试单连接数据源 http static springsou
  • 无需时间即可生成随机字符串?

    我知道如何使用 Runes 和播种 rand Init 在 go 中生成随机字符串time UnixNano 我的问题是 是否可以 使用 stdlib 在不使用当前时间戳 安全 的情况下播种 rand 此外 我问 因为仅仅依靠时间来为敏感操
  • 使用 Jasmine 模拟 jQuery ajax 调用

    我正在使用 Jasmine 2 5 2 为使用 jQuery 3 1 1 执行 Ajax 请求的代码编写单元测试 我想模拟 Ajax 调用 提供我自己的响应状态和文本 我正在使用 Jasmine ajax 插件 https github c
  • 在 Go 中使用互斥锁

    我想了解互斥体是如何工作的 据我目前的理解 它是为了进行原子操作并同步对某些数据的访问 我在这里构建了一个队列数据结构的示例 https github com arnauddri algorithms blob master data st
  • 如何从 OpenCover 报告中排除类别

    在使用 OpenCover 为 MSTest 套件生成覆盖率报告 然后使用 ReportGenerator 生成 HTML 报告 时 我尝试排除框架生成的类 特别是 通过服务引用在项目的命名空间下生成的类 我用来生成 XML 文件的命令如下
  • exec git 命令拒绝重定向到 Go 中的文件

    我试图从 go 调用 git log 并将输出重定向到给定文件 cmdArgs string log numstat reverse fmt Sprintf s HEAD 89c98f5ec48c8ac383ea9e27d792c3dc77
  • Go中如何从json字符串中获取键值

    我想尝试从 Go 中的 JSON 获取键值 但我不确定如何操作 我已经能够使用 simplejson 读取 json 值 但是我无法找到如何获取键值 有人能指出我正确的方向和 或帮助我吗 谢谢你 您可以通过执行以下操作来获取 JSON 结构
  • 包子路径'./src/ngtsc/reflection'不是由/node_modules/@angular/compiler-cli/package.json中的“exports”定义的

    我正在尝试用 jest 运行 ng 测试并收到以下错误 Package subpath src ngtsc reflection is not defined by exports in Users oyf992 source app mn
  • Android:如何根据视图模型实时数据属性为片段编写单元测试?

    我的片段 UI 中有一个列表视图 其元素集取决于来自视图模型 LiveData 属性的值的状态 我想为片段创建工具测试 该片段包含与该属性的值集相关的 3 个场景测试用例 但我不知道从哪里开始 我的代码应该如下所示 class MyView
  • Go中如何自定义http.Client或http.Transport超时重试?

    我想实现一个自定义http Transport对于标准http Client 如果客户端超时 它将自动重试 附 由于某种原因 习俗http Transport is a 一定有 我已经查过了hashcorp go retryablehttp
  • 使用 SQLite 测试 NHibernate“没有这样的表” - 生成模式

    我正在尝试使用内存中的 SQLite 数据库来测试 NHibernate 提供的数据层 我读过很多关于如何进行此设置的博客和文章 但我现在很困惑为什么它不起作用 问题 当我运行单元测试时 我收到错误 没有这样的表 学生 我读过的文章表明这
  • spring中如何进行单元测试验证注解

    我在类中有一些注释 例如 public class ProductModel Pattern regexp 1 1 9 0 9 message Quantity it should be number and greater than ze
  • 测试 - 存根服务方法未定义

    我已经在非常简单的代码上编写了一个非常简单的测试 但由于某种原因存根服务方法未定义 当我使用 Jasmine Spy 时 它可以工作 但对于这样一个简单的任务 有人可以解释一下为什么会发生这种情况吗 我删除了 import 语句只是为了减少
  • 如何在 Angular 单元测试中创建假 NgForm 对象?

    我有一个带有如下模板的组件 Template
  • Python:Factory Boy 生成对象创建时指定长度的列表

    我正在尝试使用 Factoryboy 在创建时指定长度的对象中创建一个列表 我可以创建列表 但由于提供的长度 大小的惰性性质 每次尝试创建具有指定长度的列表都会导致问题 这是我到目前为止所拥有的 class FooFactory facto

随机推荐