我正在使用Golang,目前我正在使用Testify进行一些有趣的单元测试,我的文件看起来像这样
type myStruct struct {
field_1 string
}
func (self *myStruct) writeFirst() {
//doing something
//modify field_1
self.writeSecond()
}
func (self *myStruct) writeSecond() {
//doing something
}
在这种情况下,我正在测试writeFirst(),但我正在尝试替换writeSecond(),因为它正在使用我不想使用的http内容,因为它可以访问互联网。
我认为使用第二个结构并将myStruct设置为匿名字段将是解决方案,但它不起作用,因为我的第二个结构和myStruct具有不同的上下文。
在这种情况下我不能使用mocks,因为writeSecond是struct的一个方法。
我的测试用例如下:
func TestWriteFirst(t *testing.T) {
myStc := myStruct{}
assert.Equal(t,"My response", myStc.field_1)
}
我想要的只是测试writeFirst而不传递给writeSecond()
答案 0 :(得分:1)
为了说明Not-a-Golfer中the comments提到的重构类型,您可以考虑仅在作为接口的实例上调用第二个函数:
type F2er interface {
Func2()
}
type S struct{ _f2 F2er }
var s = &S{}
func (s *S) f2() F2er {
if s._f2 == nil {
return s
}
return s._f2
}
func (s *S) Func1() {
fmt.Println("s.Func1")
s.f2().Func2()
}
此处:Func1
在Func2
上调用s.f2()
,而不是s
。
s
中未设置任何内容,s.f2()
将返回...本身:s
s._f2
被实现struct
的任何其他Func2
替换,s.f2()
将返回该实例而不是自身。请参阅此playground script中的完整示例。
输出:
TestFunc1
s.Func1
s.Func2
TestFunc1bis
s.Func1
testS.Func2 <=== different Func2 call