gpt4 book ai didi

unit-testing - 监视 Golang 中的方法

转载 作者:IT王子 更新时间:2023-10-29 01:48:36 25 4
gpt4 key购买 nike

有什么办法可以窥探 Golang 中的方法吗?

例如,假设我有

type Object struct { 
A int
B string
C *interface{}
}

func (o *Object) Something(val interface{}) {
o.A = 102
// some other business logic under test

o.SomethingElse(o.C, val)
}

//...

func (o *Object) Process(val interface{}) interface{} {
// some business logic

return 43 // or something else. no me importa ya
}

//...

func (o *Object) SomethingElse(iPtr *interface{}, val interface{}) {

processedVal := o.Process(val)
if iPtr == nil {
iPtr = new(interface{})
}

*iPtr = val
}

在针对 Object.Something 编写测试时,我们不需要关心 SomethingElse 中发生的事情或从内部调用的 Process .在 Golang 中有什么方法可以隔离这些依赖关系吗?

最佳答案

我对 spy 的理解是,一个对象的单个方法被伪造或模拟,而其他方法则没有。这在 Go 中是不可能的。但是您可以使用接口(interface)伪造或模拟您的整个依赖项。

为了伪造 SomethingElse 方法,您必须将它放在与 Object 结构分开的另一个结构上。 Object 结构还需要一个带有 SomethingElse 方法的接口(interface)。

type Object struct {
A int
elser Elser
}

func (o *Object) Something() {
// o.A = 102
o.elser.SomethingElse()
}

type Elser interface {
SomethingElse()
}

现在您可以通过创建一个实现 SomethingElse 方法的伪造来测试 Object 行为:

type fakeElser struct {
somethingElseWasCalled bool
}

func (f *fakeElser) SomethingElse() {
f.somethingElseWasCalled = true
}

func TestSomething(t *testing.T) {
fake := &fakeElser{}
o := &Object{
elser: fake,
}
o.Something()

if o.A != 102 {
t.Errorf("expected A to be %d", 102)
}

if !fake.somethingElseWasCalled {
t.Error("expected SomethingElse to be called")
}
}

https://play.golang.org/p/RdmbM6Sj5qU

关于unit-testing - 监视 Golang 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52446628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com