登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-03-22 13:58:33 404浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《在 golang 中重新定义 const 以进行测试》,正文内容主要涉及到golang等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

我正在为服务和测试编写一个 http 客户端,我想使用net/http/httptest服务器而不是调用远程 API。如果我将baseUrl一个全局变量设置为我的测试服务器的 url,我可以轻松地做到这一点。但是,这会使生产代码更加脆弱,因为baseUrl也可以在运行时更改。我的偏好是baseUrl制作const生产代码,但仍然可以更改。

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

// in main_test.go
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  ...
 }
const baseUrl = ts.URL
// above line throws const baseUrl already defined error

正确答案

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

您可以通过轻微的重构来解决您的问题。假设您有一个使用此 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()是否导出此新功能由您决定;它可能保持未导出,因为测试代码可能(应该)放在同一个包中并且可以毫无问题地调用它。

理论要掌握,实操不能落!以上关于《在 golang 中重新定义 const 以进行测试》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>