Go 单元测试深入使用

484 阅读1分钟

time.Now的mock问题

在使用bytedance/mockey: a simple and easy-to-use golang mock library (github.com)mockey的时候,可能会根据需要,对time.Now()函数进行mock。

Mock(time.Now).Return(date.Of(2021, 1, 1)).Build()

然而对系统的time.Now进行mock,可能由于一些比较深奥的原因,出现各种异常问题,比如运行的时候返回

fatal error: semacquire not on the G stack

经过很多尝试和研究,最后发现解决方法是不用它这个Mock函数对time.Now进行操作

而是在业务代码中 把 time.Now()的使用进行调整,改为

var now = time.Now

在单测中,直接修改now为自己想要的时间即可

now = func() time.Time { return date.Of(2021, 1, 1) }

-race参数的使用

go test的时候增加参数--race

如果是业务代码,被-race发现了,可以认为是防患于未然,一旦发生线上问题,很难排查

如果是单测代码,可以在go test的参数里去掉-race,假装看不见(doge