Go 模拟结构参数

Go 模拟结构参数,go,Go,充分披露:这可能真的很愚蠢,但我是新手,多年来从未使用过静态类型语言 我有一个函数如下所示: func Foo(bar *bar.BarStruct) { // do stuff with bar } 在本例中,bar是第三方包,*bar.BarStruct是指向结构的指针 我想在删除bar.BarStruct时为Foo函数编写一个测试。我如何删除*bar.BarStruct 例如,在JavaScript中,我只会执行类似的操作 test('does a Foo', () => {

充分披露:这可能真的很愚蠢,但我是新手,多年来从未使用过静态类型语言

我有一个函数如下所示:

func Foo(bar *bar.BarStruct) {
  // do stuff with bar
}
在本例中,bar是第三方包,*bar.BarStruct是指向结构的指针


我想在删除bar.BarStruct时为Foo函数编写一个测试。我如何删除*bar.BarStruct

例如,在JavaScript中,我只会执行类似的操作

test('does a Foo', () => {
  const mockBarStruct = {
    someProp: 123
  }

  Foo(mockBarStruct)
  // rest of test
})

在Go中存根结构的等效方法是什么?

如果让Foo使用接口而不是结构指针,那么在测试中,您可以传递实现该接口的模拟或伪结构

有一些模拟库,但因为Golang不允许运行时类型写入,所以它们运行编译时和输出代码


希望有帮助

如果让Foo使用接口而不是结构指针,那么在测试中可以传递实现该接口的模拟或伪结构

有一些模拟库,但因为Golang不允许运行时类型写入,所以它们运行编译时和输出代码


希望有帮助

谢谢,我已经在一些地方这样做了,但是我正在处理现有的代码,并且将不得不更改一些方法签名。除了传入接口而不是结构之外,没有其他方法了吗?如果是这样的话,我想知道为什么人们会通过structs,因为它很难测试。这是一个有趣的评论,关于什么东西都应该是一个接口。Go的类型系统类似于“duck typing”(duck typing),这通常使得在事后很容易将结构参数转换为接口参数。此外,许多IDE都有工具可以帮助这种类型的代码重写。决定什么时候接口和什么时候结构是函数的最佳参数是科学研究的一部分。谢谢,我在一些地方做过这件事,但我正在处理现有的代码,并且必须更改一系列方法签名。除了传入接口而不是结构之外,没有其他方法了吗?如果是这样的话,我想知道为什么人们会通过structs,因为它很难测试。这是一个有趣的评论,关于什么东西都应该是一个接口。Go的类型系统类似于“duck typing”(duck typing),这通常使得在事后很容易将结构参数转换为接口参数。此外,许多IDE都有工具可以帮助这种类型的代码重写。决定什么时候接口和什么时候结构是函数的最佳参数,这是复习科学的一部分。“我想为Foo函数写一个测试”这是个好主意“,同时去掉bar.BarStruct“这不是个好主意”。测试Foo是通过使用某个参数调用Foo,然后检查它是否做了正确的事情来完成的。模拟几乎从来都不是正确的测试方法。在几乎所有情况下,一个假/存根就足够了,你应该专注于更多不同的输入。接受接口,返回具体化。“我想为Foo函数编写一个测试”这是一个好主意“,而存根bar.BarStruct“这不是一个好主意”。测试Foo是通过使用某个参数调用Foo,然后检查它是否做了正确的事情来完成的。模拟几乎从来都不是正确的测试方法。在几乎所有情况下,一个伪/存根就足够了,你应该专注于更多不同的输入。接受接口,返回具体化。