我有以下方法要测试,它使用从包中导入的函数.

import x.y.z

func abc() {
    ...
    v := z.SomeFunc()
    ... 
}

可以在golang 模拟SomeFunc()吗?

推荐答案

是的,只需简单的重构.创建一个函数类型为zSomeFunc的变量,初始化为z.SomeFunc,并让您的包调用该变量,而不是z.SomeFunc():

var zSomeFunc = z.SomeFunc

func abc() {
    // ...
    v := zSomeFunc()
    // ...
}

在测试中,您可以将另一个函数赋给zSomeFunc,该函数是在测试中定义的,并且可以执行测试希望它执行的任何操作.

例如:

func TestAbc(t *testing.T) {
    // Save current function and restore at the end:
    old := zSomeFunc
    defer func() { zSomeFunc = old }()

    zSomeFunc = func() int {
        // This will be called, do whatever you want to,
        // return whatever you want to
        return 1
    }

    // Call the tested function
    abc()

    // Check expected behavior
}

请参阅相关/可能的复制: Testing os.Exit scenarios in Go with coverage information (coveralls.io/Goveralls)

Go相关问答推荐

Go PQ驱动程序无法使用默认架构进行查询

读取JSON数据并在网页上显示

如何使用Promela建模语言对Golang RWLock进行建模

如何预编译Golang标准库?

带有一个新变量的Go冒号等于运算符

为什么没有正确生成这些元组?

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

用 fork 替换 Go 依赖:...用于两个不同的模块路径

在golang二进制中嵌入SvelteKit

这是实现超时的常见方法,为什么 time.After 不起作用

Go 中的 YAML 自定义标签

如何从 Asterisk Manager Interface Event 获取活动呼叫数

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

级联调用泛型函数时的泛型类型推断

在删除级联时无法在 Gorm 中按预期工作

如何通过组合来自不同包的接口来创建接口?

转到文本/模板模板:如何根据模板本身的值数组判断值?

Go 中 SDL Surface 的 OpenGL 纹理

退格字符在围棋操场中不起作用

在 Go 中表达函数的更好方法( struct 方法)