我正在使用Golang,目前我正在使用witness进行一些有趣的单元测试,我的文件看起来像这样
type myStruct struct {
field_1 string
}
func (self *myStruct) writeFirst() {
//doing something
//modify field_1
self.writeSecond()
}
func (self *myStruct) writeSecond() {
//doing something
}
在这种情况下,我正在测试writeFirst(),但我试图取代writesecsecond(),因为它是使用http的东西,我不想使用,因为它访问互联网。
我认为使用第二个结构并将myStruct设置为匿名字段将是解决方案,但它不起作用,因为我的第二个结构和myStruct有不同的上下文。
在这种情况下,我不能使用mock,因为writesecsecond是结构体的一个方法。
我的测试用例是这样的:
func TestWriteFirst(t *testing.T) {
myStc := myStruct{}
assert.Equal(t,"My response", myStc.field_1)
}
所有我想要的是测试writeFirst没有传递到writesecsecond ()
为了说明Not-a-Golfer在评论中提到的那种重构,您可以考虑只在一个接口实例上调用第二个函数:
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
在s.f2()
上调用Func2
,而不是直接调用s
。
- 如果
s
没有设置,s.f2()
返回…self:s
- 如果
s._f2
被任何其他实现Func2
的struct
取代,s.f2()
返回该实例而不是自身。
在这个操场脚本中看到一个完整的例子。
输出:TestFunc1
s.Func1
s.Func2
TestFunc1bis
s.Func1
testS.Func2 <=== different Func2 call