3 回答
TA贡献1898条经验 获得超8个赞
我会考虑需要测试的逻辑main():
func main() {
start(os.Args)
}
func start(args []string) {
// old main() logic
}
通过这种方式,您可以在start()不改变os.Args.
TA贡献1829条经验 获得超13个赞
我采用了另一种不涉及重构 main() 的方法:请参阅此提交:
我使用全局(未导出)变量:
var args []string
然后在main(),os.Args除非var args设置了私有,否则我使用:
a := os.Args[1:]
if args != nil {
a = args
}
flag.CommandLine.Parse(a)
在我的测试中,我可以设置我想要的参数:
args = []string{"-v", "-audit", "_tests/p1/conf/gitolite.conf"}
main()
而且我仍然实现了 100% 的代码覆盖率,甚至超过了main().
TA贡献1891条经验 获得超3个赞
在 Go 1.11 中使用 @VonC 解决方案,我发现我必须在每次重新定义标志的测试中重置 flag.CommandLine,以避免“重新定义标志”恐慌。:
for _, check := range checks {
t.Run("flagging " + check.arg, func(t *testing.T) {
flag.CommandLine = flag.NewFlagSet(cmd, flag.ContinueOnError)
args = []string{check.arg}
main()
})
}
- 3 回答
- 0 关注
- 209 浏览
添加回答
举报