替换功能单元测试



我正在使用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()
}

这里:Func1s.f2()上调用Func2,而不是直接调用s

  • 如果s没有设置,s.f2()返回…self: s
  • 如果s._f2被任何其他实现Func2struct取代,s.f2()返回该实例而不是自身。

在这个操场脚本中看到一个完整的例子。

输出:

TestFunc1
s.Func1
s.Func2
TestFunc1bis
s.Func1
testS.Func2    <=== different Func2 call

最新更新