2014-07-16 171 views
1

我与Golang工作,目前我正在做一些有趣的单元测试与Testify,我的文件看起来像这样Golang:更换功能单元测试

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(),因为它使用的是我不想使用的东西,因为它访问互联网。

我认为使用第二个结构并将myStruct设置为匿名字段将是解决方案,但它不起作用,因为我第二个struct和myStruct有不同的上下文。

在这种情况下,我不能使用mocks原因writeSecond是结构的一种方法。

我的测试用例是这样的:

func TestWriteFirst(t *testing.T) { 
    myStc := myStruct{} 
    assert.Equal(t,"My response", myStc.field_1) 
} 

所有我想没有通正在测试writeFirst到writeSecond()

+0

据我所知,你不能,你必须使用标志或东西,使'writeSecond'被忽略。 – OneOfOne

+0

您必须重构代码,使writeSecond可以模拟并注入测试的某种接口。 –

回答

1

为了说明一种通过Not-a-Golferthe 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() 
} 

这里:Func1s.f2()上拨打Func2,不是直接拨打s

  • 如果没有已ss.f2()回报......本身被设置:s
  • 如果s._f2被替换它实现Func2s.f2()返回该实例,而不是本身的任何其他struct

查看playground script的完整示例。

输出:

TestFunc1 
s.Func1 
s.Func2 

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