为了账号安全,请及时绑定邮箱和手机立即绑定

在 golang 中重新定义 const 进行测试

在 golang 中重新定义 const 进行测试

Go
不负相思意 2021-11-22 17:48:34
我正在为服务和测试编写一个 http 客户端,我想使用net/http/httptest服务器而不是调用远程 API。如果我将baseUrl一个全局变量设置为我的测试服务器的 url,我可以轻松地做到这一点。然而,这使得生产代码更加脆弱,因为baseUrl也可以在运行时更改。我的偏好是为生产代码制作baseUrl一个const,但仍然可以更改。package mainconst baseUrl = "http://google.com"// in main_test.gots := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {  ... }const baseUrl = ts.URL// above line throws const baseUrl already defined error
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

如果您的代码使用 const 值,则它不适合测试(关于使用该参数的不同值进行测试)。


您可以通过轻微的重构来解决您的问题。假设您有一个使用此常量的函数:


const baseUrl = "http://google.com"


func MyFunc() string {

    // use baseUrl

}

您可以创建另一个将基本 URL 作为参数的函数,并且您的原始函数MyFunc()调用它:


const baseUrl_ = "http://google.com"


func MyFunc() string {

    // Call other function passing the const value

    return myFuncImpl(baseUrl_)

}


func myFuncImpl(baseUrl string) string {

    // use baseUrl

    // Same implementation that was in your original MyFunc() function

}

这样你的库的 API 不会改变,但现在你可以MyFunc()通过 testing 来测试你原来的功能myFuncImpl(),你可以传递任何值来测试。


调用MyFunc()将保持安全,因为它总是将 const 传递baseUrl_到myFuncImpl()实现现在所在的位置。是否myFuncImpl()导出此新函数由您决定;它可能保持未导出状态,因为测试代码可能(应该)放在同一个包中并且可以毫无问题地调用它。


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信