我如何模拟在包init()方法中调用的东西?例如:主程序var myService MyService = myservicepkg.New()func init(){ response := myService.get()}func otherMethod(){ //do something}主测试.gofunc Test_otherMethod(){ ctrl := NewController(t) defer ctrl.Finish() myServiceMock = myservicepkg.NewMock(myService) myServiceMock.EXPECT().get().return("success")}问题是init()在服务被模拟替换之前被调用。
3 回答
烙印99
TA贡献1829条经验 获得超13个赞
这是使用可变全局状态的问题。
我的建议是添加一个标志以在某些条件下不运行它,或者公开一个可以在内部测试中恢复/更新这个全局变量的私有函数。
这反映了您的设计:如果测试起来很复杂,也许您应该重构。
创建一个带有字段服务的对象应用程序,在构造函数/构建器/工厂上创建将更容易测试。
init的用法很讲究。除了将驱动程序注册到 sql 包中,我从不使用它(可能是为了处理标志)。
也许你可以在你的设计中添加更多的 OO
RISEBY
TA贡献1856条经验 获得超5个赞
我找到了一个解决方法,您可以阻止初始化代码在您的测试中执行,并像这样隔离地测试该方法:
func init(){
if len(os.Args) > 0 && strings.HasSuffix(os.Args[0], ".test") {
log.Printf("skipping jwt.init() for testing")
} else if len(os.Args) > 1 && strings.HasSuffix(os.Args[1], "-test.run") {
log.Printf("skipping jwt.init() for testing")
} else {
response := myService.get()
}
}
这将阻止调用 init 服务调用。
- 3 回答
- 0 关注
- 268 浏览
添加回答
举报
0/150
提交
取消
